如何从包含JavaScript重复项的数组中获取一组唯一值?

Nav*_*ida 108 javascript arrays unique

给定一个['0','1','1','2','3','3','3']数组,结果应该是['0','1','2','3'].

Ped*_* L. 257

编辑

ES6解决方案:

[...new Set(a)];
Run Code Online (Sandbox Code Playgroud)

替代方案:

Array.from(new Set(a));
Run Code Online (Sandbox Code Playgroud)

旧的回应.O(n ^ 2)(不要与大数组一起使用!)

var arrayUnique = function(a) {
    return a.reduce(function(p, c) {
        if (p.indexOf(c) < 0) p.push(c);
        return p;
    }, []);
};
Run Code Online (Sandbox Code Playgroud)

  • 现在是2014年,所以我们需要再次使用分号. (107认同)
  • 现在是2015年,所以我们不再需要分号了. (56认同)
  • 我们需要在2016年使用分号吗? (49认同)
  • 废话!你需要使用分号!http://jsfiddle.net/bTNc2/ (31认同)
  • 现在是2016年中期,大部分时间都是"分号是可选的,但非常鼓励". (28认同)
  • 这是你错的地方@MarkKnol.现在是四月,每个人都知道在北半球的春季和夏季需要分号.你的评论是在2月写的,所以我想你应该给予一些回旋余地.顺便说一句,有人可以在秋天回来(你们都是秋天)并且去掉分号吗? (11认同)
  • 这是偶数年,所以是的,你确实需要分号:) (11认同)
  • 现在是2016年,我们再次需要分号 (9认同)
  • 它现在是2018年.无论你使用哪种分号标准,我们已经决定,无论谁接管你的项目,都会令人信服地解释说,之前的开发人员是选择该标准的白痴. (7认同)
  • 这是2042年,什么是分号? (5认同)
  • @PedroL."如果你想缩小你的代码,你需要分号吗?" 你为什么这么说?省略分号是一种缩小代码的方法.分号字符占用与换行符相同的空间.用分号替换所有换行符不会给你更小的代码.但是"缩小"它的过程将成为潜在失败的另一个点,你的最终结果将是难以调试的混淆代码. (4认同)
  • @MangledDeutz现在全冒号. (3认同)
  • 现在是2017年,根据[**StandardJS**](https://standardjs.com/#the-rules),我们不应该**使用分号.他们引用[**这些**](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding)[**three**](http:// inimino.org/~inimino/blog/javascript_semicolons)[**参考**](https://www.youtube.com/watch?v=gsfbh17Ax9I)的推理. (3认同)
  • 道格拉斯克罗克福德将适合@countfloortiles.你需要分号. (2认同)
  • @PedroL.只是想提一下这个函数是区分大小写的,所以你仍然可以有重复项.`c = c.toString().toLowerCase();`为我解决了这个问题. (2认同)
  • 2017年@MangledDeutz [发生这种情况](https://bugs.webkit.org/show_bug.cgi?id=176114). (2认同)

bea*_*mit 51

如果您想维持秩序:

arr = arr.reverse().filter(function (e, i, arr) {
    return arr.indexOf(e, i+1) === -1;
}).reverse();
Run Code Online (Sandbox Code Playgroud)

由于没有内置的反向索引,我反转数组,过滤掉重复数据,然后重新反转它.

filter函数查找当前索引之后(在原始数组之前)元素的任何出现.如果找到一个,它会抛出这个元素.

编辑:

或者,您可以使用lastindexOf(如果您不关心订单):

arr = arr.filter(function (e, i, arr) {
    return arr.lastIndexOf(e) === i;
});
Run Code Online (Sandbox Code Playgroud)

这将保留唯一元素,但仅限于最后一次出现.这意味着['0','1','0']变为['1','0'],而不是['0','1'].

  • +1打高尔夫球.不幸的是,直接的'for`循环似乎表现得更好[JSPerf](http://jsperf.com/distinct-hash-vs-comparison).该死的函数调用非常昂贵. (2认同)

小智 26

这是一个Array Prototype函数:

Array.prototype.unique = function() {
    var unique = [];
    for (var i = 0; i < this.length; i++) {
        if (unique.indexOf(this[i]) == -1) {
            unique.push(this[i]);
        }
    }
    return unique;
};
Run Code Online (Sandbox Code Playgroud)

  • 这是最简单的阅读代码XD (2认同)

fgu*_*len 14

使用underscorejs

_.uniq([1, 2, 1, 3, 1, 4]); //=> [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)


OhJ*_*eez 13

这是2014年的现在,时间复杂性仍然很重要!

array.filter(function() {
  var seen = {};
  return function(element, index, array) {
    return !(element in seen) && (seen[element] = 1);
  };
}());
Run Code Online (Sandbox Code Playgroud)

http://jsperf.com/array-filter-unique/13


Rae*_*kye 9

function array_unique(arr) {
    var result = [];
    for (var i = 0; i < arr.length; i++) {
        if (result.indexOf(arr[i]) == -1) {
            result.push(arr[i]);
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

不是内置功能.如果产品列表不包含该项,请将其添加到唯一列表并返回唯一列表.


小智 6

你去!别客气!

Array.prototype.unique = function()
{
    var tmp = {}, out = [];
    for(var i = 0, n = this.length; i < n; ++i)
    {
        if(!tmp[this[i]]) { tmp[this[i]] = true; out.push(this[i]); }
    }
    return out;
}

var a = [1,2,2,7,4,1,'a',0,6,9,'a'];
var b = a.unique();
alert(a);
alert(b);
Run Code Online (Sandbox Code Playgroud)


Nav*_*ida 1

function array_unique(nav_array) {
    nav_array = nav_array.sort(function (a, b) { return a*1 - b*1; });      
    var ret = [nav_array[0]];       
    // Start loop at 1 as element 0 can never be a duplicate
    for (var i = 1; i < nav_array.length; i++) { 
        if (nav_array[i-1] !== nav_array[i]) {              
            ret.push(nav_array[i]);             
        }       
    }
    return ret;     
}
Run Code Online (Sandbox Code Playgroud)