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

IT技术 javascript arrays unique
2021-02-01 06:47:11

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

6个回答

已编辑

ES6解决方案:

[...new Set(a)];

选择:

Array.from(new Set(a));

旧回复。O(n^2)(不要在大数组中使用它!)

var arrayUnique = function(a) {
    return a.reduce(function(p, c) {
        if (p.indexOf(c) < 0) p.push(c);
        return p;
    }, []);
};
废话!你确实需要使用分号!jsfiddle.net/bTNc2
2021-03-15 06:47:11
现在是 2014 年,所以我们再次需要分号。
2021-03-22 06:47:11
现在是 2016 年的中途,大部分时间已经过去了semicolons are optional but highly encouraged一年。
2021-03-26 06:47:11
现在是 2015 年,所以我们不再需要分号了。
2021-04-02 06:47:11
2016 年我们需要使用分号吗?
2021-04-08 06:47:11

如果你想维持秩序:

arr = arr.reverse().filter(function (e, i, arr) {
    return arr.indexOf(e, i+1) === -1;
}).reverse();

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

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

编辑:

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

arr = arr.filter(function (e, i, arr) {
    return arr.lastIndexOf(e) === i;
});

这将保留唯一元素,但仅保留最后一次出现的元素。这意味着 ['0', '1', '0'] 变成了 ['1', '0'],而不是 ['0', '1']。

有趣的解决方案,lastIndexOf 有效吗?
2021-03-17 06:47:11
@merv - OP 没有提及性能,所以我很有创意。代码很简单,不是吗?
2021-03-19 06:47:11
+1 打高尔夫球。不幸的是,直线for循环似乎表现更好JSPerf该死的函数调用是如此昂贵。
2021-03-20 06:47:11
有点,但这取决于你的意思。如果您不需要 order 而不是 reverse() hack,则可以使用它。
2021-04-07 06:47:11
好的![1,2,3,1,1].filter(function(elem,idx,arr){ return arr.indexOf(elem) >= idx; });不过喜欢,它更直接
2021-04-13 06:47:11

这是一个数组原型函数:

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;
};
这是最简单的阅读代码XD
2021-03-20 06:47:11

下划线

_.uniq([1, 2, 1, 3, 1, 4]); //=> [1, 2, 3, 4]
这是否适用于数组数组
2021-03-20 06:47:11

现在是 2014 年,伙计们,时间复杂度仍然很重要!

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

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