在 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']
本机方法将遍历数组,并仅保留那些传递给定回调函数的条目。filter
onlyUnique
onlyUnique
检查,如果给定的值是第一个出现的。如果不是,它必须是副本,并且不会被复制。
该解决方案无需任何额外的库(如jQuery或原型.js) 即可工作。
它也适用于具有混合值类型的数组。
对于不支持本机方法的旧浏览器(<ie9),您可以在MDN文档中找到过滤器和indexOf的解决方法。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']
的构造函数采用可迭代对象(如 Array),而展开运算符将该集合转换回 Array。感谢卢卡斯·利斯的评论。Set
...