推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
wenjay

数组去重

  •  
  •   wenjay · Jul 18, 2019 · 8426 views
    This topic created in 2664 days ago, the information mentioned may be changed or developed.

    数组去重

     Array.prototype.unique1 = function () {
       var n = []; //一个新的临时数组
       for (var i = 0; i < this.length; i++) //遍历当前数组
       {
         if (n.indexOf(this[i]) == -1) n.push(this[i]);
       }
       return n
    }
    
    Supplement 1  ·  Jul 18, 2019
    面试老喜欢问这个
    征集下高级(装逼)回答,可以纵观发展历史、性能、工具又不太啰嗦。👻

    目前已知的高级回答:时间复杂度为 O(n^2),空间复杂度为 O(n)😂
    49 replies  •  2019-07-23 09:13:03 +08:00
    zhao7399686
    zhao7399686
    Jul 18, 2019
    1
    ?
    NewDraw
    NewDraw
    Jul 18, 2019 via Android
    2
    这代码是在养蛊啊!
    AlloVince
    AlloVince
    Jul 18, 2019❤️5
    3
    ``` js
    Array.from(new Set(inputArray));
    ```
    wenjay
    wenjay
    OP
    Jul 18, 2019
    4
    发出去的文章不能修改的吗?
    shakaraka
    shakaraka
    Jul 18, 2019
    5
    wenjay
    wenjay
    OP
    Jul 18, 2019
    6
    @AlloVince ES6 就是如此简单,不过面试老喜欢问这个问题,要如何回答才能显得高级呢😂
    Yumwey
    Yumwey
    Jul 18, 2019
    7
    用 filter 一行就写完了
    starsriver
    starsriver
    Jul 18, 2019 via Android
    8
    es6 new 的 array 自动去重。
    lihongjie0209
    lihongjie0209
    Jul 18, 2019
    10
    数据结构没学好?
    xingyue
    xingyue
    Jul 18, 2019
    11
    我这是要完犊子了吗,看了半天没觉得有什么问题.....除了代码啰嗦了点。再看看 #1 #2 #10,现在内心慌的一.....
    taogen
    taogen
    Jul 18, 2019 via Android
    12
    就说算法的时间复杂度为 O(n^2),空间复杂度为 O(n)。高级否?
    taogen
    taogen
    Jul 18, 2019 via Android
    13
    另外,用 hash table 作为中间容器,时间复杂度可以为 O(n)
    oIMOo
    oIMOo
    Jul 18, 2019
    14
    转成 set 再转回 list 怎么样?
    lynnic
    lynnic
    Jul 18, 2019 via Android
    15
    时间复杂度为啥是 n 方?
    necomancer
    necomancer
    Jul 18, 2019
    16
    @lynnic indexof 是 o(n) 的吧
    Chemist
    Chemist
    Jul 18, 2019 via iPhone
    17
    @necomancer 外面还有一层 n🤣
    serenader
    serenader
    Jul 19, 2019❤️2
    18
    LZ 的这个方法有个 bug,无法去重 NaN 以及 {} 。

    几年前我写过一篇文章,也是讲去重的:blog.serenader.me/javascript-shu-zu-qu-zhong/

    不过刚刚看了一下,我文章里面最后给出的方案也有 bug。。纯粹当抛砖引玉了,看看大家能找到几个 bug 🤣🤣
    indomi
    indomi
    Jul 19, 2019
    19
    [...new Set(arr)]
    bumz
    bumz
    Jul 19, 2019 via iPhone
    20
    ES6 之前就手写一哈希表,高级吗,手动狗头
    15651980765
    15651980765
    Jul 19, 2019
    21
    @Yumwey 请问用 filter 是这样吗?
    Array.prototype.unique = function() {
    return this.filter(function(item, index, array) {return array.indexOf(item) === index});
    }
    我测了一下这种方法在数组很长( 4000w+)的情况下,耗时差不多是楼主方法的两倍。
    Array.from(new Set(array))这种比楼主的方法稍微快一点
    stillsilly
    stillsilly
    Jul 19, 2019
    22
    let a = [1,1,2,2,2,3,3]
    let b = [...new Set(a)]
    console.log(b)
    imbacc
    imbacc
    Jul 19, 2019
    23
    后排吃瓜
    karllynn
    karllynn
    Jul 19, 2019
    24
    用 hash 的话,数组的顺序会变的…楼主这个时间复杂度太高了
    QiaTia
    QiaTia
    Jul 19, 2019
    25
    ```
    Array.prototype.unique1 = function () {
    var n = {}; //一个新的临时数组
    for (var i = 0; i < this.length; i++) //遍历当前数组
    {
    if (n.[this[i]] !== 'a') n[this[i]]='a'
    }
    return Object.keys(n)
    }
    ```
    QiaTia
    QiaTia
    Jul 19, 2019
    26
    @QiaTia 多打了一个点 if (n[this[i]] !== 'a')
    dartabe
    dartabe
    Jul 19, 2019
    27
    之前在写 leetcode 的时候用的 set 做的中间容器. 时间复杂度 O(n)

    后来发现 set 自动就可以去重了
    dartabe
    dartabe
    Jul 19, 2019
    28
    不过 javascript 对象直接就是哈希表了? 用 set 的话我只是懒得存 1/0 或者 true /false

    求大佬看我理解对不对
    weixiangzhe
    weixiangzhe
    Jul 19, 2019 via iPhone
    29
    这种东西 直接看 lodash 源码最靠谱了
    reus
    reus
    Jul 19, 2019
    30
    把 indexOf 改成对 Set 的操作,用 Set 辅助去重
    如果没有 Set,那就自己实现一个
    CodingNaux
    CodingNaux
    Jul 19, 2019 via iPhone
    31
    unique ( collection,func)
    wozhizui
    wozhizui
    Jul 19, 2019
    34
    @oIMOo 俺也一样
    Arizas
    Arizas
    Jul 19, 2019
    35
    uniqueResult = [...new Set(arr)]
    Aoerz
    Aoerz
    Jul 19, 2019 via Android
    36
    首先排序,然后遍历,时间复杂度 O(n),空间复杂度 O(1)
    Snail233
    Snail233
    Jul 19, 2019
    37
    es6 不是有 set 么、
    lihongjie0209
    lihongjie0209
    Jul 19, 2019❤️3
    38
    @Aoerz
    排序的 nlogn 的时间复杂度不算了?
    Fairy1128
    Fairy1128
    Jul 19, 2019
    39
    难道不是先问 数组的 item 是普通类型还是引用类型吗
    Laumm
    Laumm
    Jul 19, 2019
    40
    @Aoerz 既然都需要排序了,时间复杂度就应该大于 O(n)
    Laumm
    Laumm
    Jul 19, 2019
    41
    感觉最简单就是放 Set 里了
    arnoldxiao
    arnoldxiao
    Jul 19, 2019
    42
    用 Set 含一下再放回去
    fengdechoulian
    fengdechoulian
    Jul 19, 2019
    43
    @arnoldxiao 仰望高端玩家
    doing1
    doing1
    Jul 19, 2019
    44
    我服了
    Aoerz
    Aoerz
    Jul 19, 2019 via Android
    45
    @Laumm 是的,把排序这茬给忘了
    DRcoding
    DRcoding
    Jul 19, 2019
    46
    所谓的 filter
    var r = ['aa','bb','cc','bb'].filter(function (ele, index, self) {
    return self.indexOf(ele) === index;
    });
    console.log(r.toString());
    ChiangDi
    ChiangDi
    Jul 19, 2019 via iPhone
    47
    不能先排序吧,数组里可能有数字可能有字符串或者其它任何东西
    YouMoeYi
    YouMoeYi
    Jul 19, 2019
    48
    为啥不用 Set
    function arr_dr (arr){
    let st = new Set(arr);
    return [...st];
    }
    mystorp
    mystorp
    Jul 23, 2019
    49
    Array.prototype.unique1 = function () {
    let m = new Map;
    for (var i = 0; i < this.length; i++) //遍历当前数组
    {
    // 不同于 {}, Map 是有序的哈希表
    // Map 的 key 可以是任意 js 值
    m.set(this[i], true);
    }
    return m.keys();
    }

    let arr = [1, 1, 2, 2, NaN, NaN, null, null, undefined, undefined, {}, [], Symbol.split, '', '', false, false];
    console.log(arr.unique1());
    // MapIterator { 1, 2, NaN, null, undefined, {}, [], Symbol(Symbol.split), '', false }
    arr.push(arr.shift(), arr.shift());
    console.log(arr.unique1());
    // MapIterator { 2, NaN, null, undefined, {}, [], Symbol(Symbol.split), '', false, 1 }
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5293 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 01:22 · PVG 09:22 · LAX 17:22 · JFK 20:22
    ♥ Do have faith in what you're doing.