协慌网

登录 贡献 社区

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

我有一系列数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它的工作情况很好,直到数组中的数字为零。我发现这个其他脚本在 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。

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

对于不支持本机方法filterindexOf旧浏览器(filterindexOf 的解决方法

如果要保留最后一次出现的值,只需用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]