说说去重
2018-12-30 本文已影响0人
我也不知道啊丶
数组去重是一道经典的面试题,实现的方法有很多,坑也有不少,下面来看看
有一个数组 var arr1 = [1,2,3,4,2,5,3,6,1];
如何快速去重呢
方法1:
function uniq(array){
var result = [];
var hash = {};
for( let i = 0; i < array.length; i++){
hash[array[i]] = true
}
for(let key in hash){
result.push(key)
}
return result
}
console.log(uniq(arr1))
用对象的下标 来储存然后添加到一个新数组,这种方法看起来好像没有问题,可以实现去重,但是 会有一些坑
可以看到,数组里的值都变成了字符串,是因为js规定,所有对象的下标,只支持字符串,就算用
[变量]
,打印出来还是字符串还有 如果原数组里不光有数字,还有字符串
var arr1 = [1,2,3,4,2,5,3,6,1,'1','2'];
正确的结果应该是
[1,2,3,4,5,6,'1','2']
然而结果还是
原因上面说了
还有一种情况,如果原数组里有对象呢
var arr1 = [1,2,3,4,2,5,3,6,1,'1','2',{name:"jack"}];
再用这种方法,结果是
为什么会是
[object Object]
呢因为对象的下标只支持字符串,所以当下标是一个对象时,会自动调用对象的
toString()
方法我们来随便声明一个对象调用
toString()
看会怎么样所有对象变成字符串都是
[object Object]
总结一下,用对象下标的这种方法的两个致命缺点:
1. 无法区分数字和字符串
2. 无法统计对象
3. 结果都是字符串
好,我们来看看ES6提供的新方法能不能实现这个目的
首先我们知道ES6提供了一个 Array.from()
方法
这个方法会把传入的任意对象变成一个数组
然后ES6还提供了一个新对象 Set
,来看看MDN上对这个对象的解释
Set
对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
ok,那么我们来改写一下代码
完美,优雅
最后用ES6的语法糖来个装x的写法来结束吧
[ ... obj ] 等价于 Array.from(obj)
,但是为了代码的易读性,还是用上面那种比较好吧