js实现数组去重
来源:互联网 发布:centos下搭建hadoop 编辑:程序博客网 时间:2024/06/05 19:50
[...new Set([1, "1", 2, 1, 1, 3])]
3、数组去重
注:暂不考虑
对象字面
量,函数
等引用类型的去重,也不考虑NaN
,undefined
,null
等特殊类型情况。数组样本:[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
阅读全文