说说去重

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),但是为了代码的易读性,还是用上面那种比较好吧
上一篇 下一篇

猜你喜欢

热点阅读