获取 JavaScript 数组中的所有唯一值(删除重复项)

2022-08-29 21:50:35

我有一个数字数组,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在Stack Overflow上发现了另一个脚本,它看起来几乎与它完全一样,但它并没有失败。

因此,为了帮助我学习,有人可以帮助我确定原型脚本出错的地方吗?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

来自重复问题的更多答案:

类似的问题:


答案 1

JavaScript 1.6 / ECMAScript 5 中,您可以通过以下方式使用数组的本机过滤器方法来获取具有唯一值的数组:

function onlyUnique(value, index, self) {
  return self.indexOf(value) === index;
}

// usage example:
var a = ['a', 1, 'a', 2, '1'];
var unique = a.filter(onlyUnique);

console.log(unique); // ['a', 1, 2, '1']

本机方法将遍历数组,并仅保留那些传递给定回调函数的条目。filteronlyUnique

onlyUnique检查,如果给定的值是第一个出现的。如果不是,它必须是副本,并且不会被复制。

该解决方案无需任何额外的库(如jQuery或原型.js) 即可工作。

它也适用于具有混合值类型的数组。

对于不支持本机方法的旧浏览器(<ie9),您可以在MDN文档中找到过滤器indexOf的解决方法。filterindexOf

如果要保留某个值的最后一个匹配项,只需替换为 。indexOflastIndexOf

使用ES6,这可以缩短为:

// usage example:
var myArray = ['a', 1, 'a', 2, '1'];
var unique = myArray.filter((v, i, a) => a.indexOf(v) === i);

console.log(unique); // unique is ['a', 1, 2, '1']

感谢卡米洛·马丁的评论提示。

ES6 具有一个本机对象 Set 来存储唯一值。要获取具有唯一值的数组,您现在可以执行以下操作:

var myArray = ['a', 1, 'a', 2, '1'];

let unique = [...new Set(myArray)];

console.log(unique); // unique is ['a', 1, 2, '1']

的构造函数采用可迭代对象(如 Array),而展开运算符将该集合转换回 Array。感谢卢卡斯·利斯的评论。Set...


答案 2

ES6/ES2015 的更新答案:使用 Set展开运算符(感谢 le-m),单行解决方案是:

let uniqueItems = [...new Set(items)]

哪个返回

[4, 5, 6, 3, 2, 23, 1]