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

新手上路,请多包涵

我有一组数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在 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;
}

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

类似的问题:

原文由 Mottie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 789
2 个回答

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

 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']

本机方法 filter 将遍历数组并只留下那些通过给定回调函数 onlyUnique 的条目。

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

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

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

对于不支持原生方法 filterindexOf 的旧浏览器 (filter 和 indexOf 的变通方法。

如果要保留最后一次出现的值,只需将 indexOf 替换为 lastIndexOf

使用 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']

感谢 Camilo Martin 的评论提示。

ES6 有一个原生对象 Set 来存储唯一值。要获取具有唯一值的数组,您现在可以这样做:

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

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

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

Set 的构造函数接受一个可迭代的对象,比如一个数组,而扩展运算符 ... 将集合转换回一个数组。感谢 Lukas Liese 的评论提示。

原文由 TLindig 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

哪个返回

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

原文由 A.T. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题