我有一个数字数组,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在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;
}
网友回答:
ES6/ES2015 的更新答案:使用 Set 和点差运算符(感谢 le-m),单行解决方案为:
let uniqueItems = [...new Set(items)]
哪个返回
[4, 5, 6, 3, 2, 23, 1]
网友回答:
在 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);
console.log(unique); // ['a', 1, 2, '1']
本机方法将遍历数组,只保留那些传递给定回调函数的条目。filter
onlyUnique
onlyUnique
检查给定的值是否是第一个出现。如果不是,则它必须是重复的,不会被复制。
该解决方案无需任何额外的库(如jQuery或prototype.js)即可工作。
它也适用于具有混合值类型的数组。
对于不支持本机方法的旧浏览器(<ie9),您可以在 MDN 文档中找到过滤器和索引的解决方法。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']
感谢卡米洛·马丁在评论中的提示。
ES6 有一个本机对象来存储唯一值。要获取具有唯一值的数组,您现在可以执行以下操作:Set
var myArray = ['a', 1, 'a', 2, '1'];
let unique = [...new Set(myArray)];
console.log(unique); // unique is ['a', 1, 2, '1']
的构造函数采用可迭代对象,如数组,展开运算符将集合转换回数组。感谢卢卡斯·利斯的评论提示。Set
...
网友回答:
我将所有答案分为 4 个可能的解决方案:
{ }
[ ]
filter + indexOf
Sets
以下是答案中的示例代码:
{ }
function uniqueArray1( ar ) {
var j = {};
ar.forEach( function(v) {
j[v+ '::' + typeof v] = v;
});
return Object.keys(j).map(function(v){
return j[v];
});
}
[ ]
function uniqueArray2(arr) {
var a = [];
for (var i=0, l=arr.length; i<l; i++)
if (a.indexOf(arr[i]) === -1 && arr[i] !== '')
a.push(arr[i]);
return a;
}
filter + indexOf
function uniqueArray3(a) {
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
// usage
var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']
return unique;
}
[...new Set(a)]
function uniqueArray4(a) {
return [...new Set(a)];
}
我想知道哪一个更快。我制作了示例谷歌表格来测试功能。注意:ECMA 6 在 Google 表格中不可用,所以我无法对其进行测试。
我希望看到使用对象的代码会获胜,因为它使用哈希。所以我很高兴测试显示了这种算法在Chrome和IE中的最佳结果。感谢@rab的代码。{ }
谷歌脚本启用了ES6引擎。现在我测试了最后一个代码,它看起来比对象方法更快。Sets
模板简介:该模板名称为【从 JS 数组中删除重复值?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。