获取数组中的所有唯一值(删除重复项)
我有一系列数字,我需要确保它们是唯一的。 我在互联网上找到了下面的代码片段,它在数组中有一个零之前工作得很好。 我在SO上发现了这个其他脚本,看起来几乎完全一样,但它不会失败。
所以为了帮助我学习,有人能帮我确定原型脚本出错的地方吗?
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;
}
重复问题的更多答案:
类似的问题:
使用JavaScript 1.6 / ECMAScript 5,您可以通过以下方式使用Array的本机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 ); // returns ['a', 1, 2, '1']
本地方法filter
将循环访问数组,并只保留那些通过给定回调函数onlyUnique
。
onlyUnique
检查,如果给定的值是第一次发生。 如果不是,它必须是重复的,不会被复制。
这个解决方案没有任何额外的库,如jQuery或prototype.js。
它也适用于具有混合值类型的数组。
对于不支持本机方法filter
和indexOf
旧浏览器(<ie9),您可以在MDN文档中找到适用于filter
和indexOf
变通办法。
如果你想保持一个值的最后一次出现,简单地用lastIndexOf
替换indexOf
。
有了ES6,它可以缩短为:
// usage example:
var myArray = ['a', 1, 'a', 2, '1'];
var unique = myArray.filter((v, i, a) => a.indexOf(v) === i);
// unique is ['a', 1, 2, '1']
感谢Camilo Martin提供的意见。
ES6有一个本地对象Set
为存储唯一值。 要获得具有唯一值的数组,现在可以这样做:
var myArray = ['a', 1, 'a', 2, '1'];
let unique = [...new Set(myArray)];
// unique is ['a', 1, 2, '1']
的构造函数Set
需要一个迭代的对象,如Array和传播运营商...
变换设定回一个数组。 感谢Lukas Liese提出的意见。
更新了ES6 / ES2015的答案 :使用Set,单线解决方案是:
var items = [4,5,4,6,3,4,5,2,23,1,4,4,4]
var uniqueItems = Array.from(new Set(items))
哪个返回
[4, 5, 6, 3, 2, 23, 1]
正如le_m建议的那样,这也可以使用扩展运算符来缩短,如
var uniqueItems = [...new Set(items)]
你也可以使用underscore.js。
console.log(_.uniq([1, 2, 1, 3, 1, 4]));
<script src="http://underscorejs.org/underscore-min.js"></script>
链接地址: http://www.djcxy.com/p/19035.html