美文网首页
说说去重

说说去重

作者: 我也不知道啊丶 | 来源:发表于2018-12-30 22:47 被阅读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),但是为了代码的易读性,还是用上面那种比较好吧

相关文章

  • 说说去重

    数组去重是一道经典的面试题,实现的方法有很多,坑也有不少,下面来看看有一个数组 var arr1 = [1,2,3...

  • 去重去重

    哈哈^_^

  • 去重

    LIst去重 List deptList=new ArrayList<>(); for (String s...

  • 去重

    my @cancer = grep{!$_{$_}++}@Cancer;

  • 去重

  • 去重

  • 去重

  • 去重

    图片上传 检测是否重复再上传 基本去重

  • Swift 数组去重(有序去重)

    今天的需求 需要对数组去重 写了下面的方法 留着备用 调用

  • 说说重疾险

    朋友给儿子买了份重疾险,年缴保费5000多,缴费20期,保额400000,保险期限是被保险人终身。 ...

网友评论

      本文标题:说说去重

      本文链接:https://www.haomeiwen.com/subject/wweblqtx.html