我有一系列数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它的工作情况很好,直到数组中的数字为零。我发现这个其他脚本在 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
旧浏览器(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建议的那样,这也可以使用spread 运算符缩短,比如
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>
将返回:
[1, 2, 3, 4]