js实现数组去重

来源:互联网 发布:centos下搭建hadoop 编辑:程序博客网 时间:2024/06/05 19:50
[...new Set([1, "1", 2, 1, 1, 3])]

3、数组去重

注:暂不考虑对象字面量,函数等引用类型的去重,也不考虑 NaNundefinednull等特殊类型情况。

数组样本:[1, 1, '1', '2', 1]

3.1 普通版

无需思考,我们可以得到 O(n^2) 复杂度的解法。定义一个变量数组 res 保存结果,遍历需要去重的数组,如果该元素已经存在在 res 中了,则说明是重复的元素,如果没有,则放入 res 中。

var a = [1, 1, '1', '2', 1]function unique(arr) {    var res = []    for (var i = 0, len = arr.length; i < len; i++) {        var item = arr[i]        for (var j = 0, len = res.length; j < jlen; j++) {            if (item === res[j]) //arr数组的item在res已经存在,就跳出循环                break        }        if (j === jlen) //循环完毕,arr数组的item在res找不到,就push到res数组中            res.push(item)    }    return res}console.log(unique(a)) // [1, 2, "1"]

优点: 没有任何兼容性问题,通俗易懂,没有任何理解成本
缺点: 看起来比较臃肿比较繁琐,时间复杂度比较高O(n^2)

3.2 进阶版

var a =  [1, 1, '1', '2', 1]function unique(arr) {    return arr.filter(function(ele,index,array){        return array.indexOf(ele) === index//很巧妙,这样筛选一对一的,过滤掉重复的    })}console.log(unique(a)) // [1, 2, "1"]

优点:很简洁,思维也比较巧妙,直观易懂。
缺点:不支持 IE9 以下的浏览器,时间复杂度还是O(n^2)

3.3 时间复杂度为O(n)

var a =  [1, 1, '1', '2', 1]function unique(arr) {    var obj = {}    return arr.filter(function(item, index, array){        return obj.hasOwnProperty(typeof item + item) ?         false :         (obj[typeof item + item] = true)    })}console.log(unique(a)) // [1, 2, "1"]

优点:hasOwnProperty 是对象的属性(名称)存在性检查方法。对象的属性可以基于 Hash 表实现,因此对属性进行访问的时间复杂度可以达到O(1);
filter 是数组迭代的方法,内部还是一个 for 循环,所以时间复杂度是 O(n)
缺点:不兼容 IE9 以下浏览器,其实也好解决,把 filter 方法用 for 循环代替或者自己模拟一个 filter 方法。

3.4 终极版

以 Set 为例,ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

const unique = a => [...new Set(a)]

优点:ES6 语法,简洁高效,我们可以看到,去重方法从原始的 14 行代码到 ES6 的 1 行代码,其实也说明了 JavaScript 这门语言在不停的进步,相信以后的开发也会越来越高效。
缺点:兼容性问题,现代浏览器才支持,有 babel 这些都不是问题。

你可能不知道的前端知识点:ES6 新的数据结构 Set 去重

原文:https://github.com/jawil/blog/issues/24
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 机动车损失险什么意思 机动车损失险 资产减值损失 资产减值损失属于什么科目 信用减值损失 精神损失费赔偿标准 机动车损失保险 损失的反义词 资产减值损失科目 机动车损失险有必要买吗 机动车损失保险什么意思 巴菲特损失28亿 信用减值损失属于什么科目 车辆损失险什么意思 车辆损失险赔偿范围 识别到压力损失可以继续开吗 2018新车贬值损失理赔成功案例 特价机票怎么退损失小 朝鲜战场中国一共损失多少人 美国通用汽车每天损失4亿美元 车辆召回有补偿损失吗 损益类科目 损益类账户 损益表 结转损益 当期损益 汇兑损益 损益 三分损益法 损益表模板 斟酌损益 损益类 损益结转 损益类科目借贷方向 非经常性损益 当期损益包括哪些科目 少数股东损益 非经常性损益包括哪些 损益类科目有哪些 期间损益结转 损益表和利润表