如果我有一个如下的数组作为例子:
myArray = [1,4,5,1,5];
如何删除所有重复的值(在这个例子中是所有的1和5)并只返回唯一的元素(在这个例子中是4).
非常感谢您的帮助。
myArray = [1,4,5,1,5];
如何删除所有重复的值(在这个例子中是所有的1和5)并只返回唯一的元素(在这个例子中是4).
非常感谢您的帮助。
我认为
[1,4,5,1,5].filter(function(x, n, self) {
return self.indexOf(x) == self.lastIndexOf(x)
})
使用下划线的基于哈希的更高效版本:
a =[1, 2, 3, 3, 4, 2, 1, 5]
uniqs = _.chain(a).countBy().pairs().filter(function(x) {
return x[1] == 1
}).pluck(0).value()
或者纯JavaScript:
a = [1, 2, 3, 3, 4, 2, 1, 5]
hash = {}
a.forEach(function(x) {
hash[x] = (Number(hash[x]) || 0) + 1
});
uniq = Object.keys(hash).filter(function(n) {
return hash[n] == 1
});
["4","5"]
)。a = [1, 2, 3, 3, 4, 2, 1, 5]
uniq = a.sort().filter(function(x, n, self) {
return x != self[n - 1] && x != self[n + 1];
});
//[4, 5]
x = {x:1}; y = {y:1}; a = [x, y, x, x];
uniq = a.filter(function(x, n, self) {
return self.indexOf(x) == self.lastIndexOf(x)
})
// {"y":1}
对于那些好奇的人,性能测试(在不同浏览器中表现不一致):http://jsperf.com/efficient-unique/2
O(nlog(n))
而非O(n^2)
),但是它会修改现有的数组。var unique = [];
myArray.sort();
for (var i=0, j;i<myArray.length;i = j) {
for (j=i+1;j<myArray.length && myArray[i] === myArray[j]; j++);
if (j == i + 1) {
unique.push(myArray[i]);
}
}
// use unique
如评论中讨论的那样,您也可以利用一个对象来实现O(n)
的解决方案,但是这种方法的执行时间在不同平台上变化很大(有时比上面的解决方案慢,有时更快)。
var unique = [], hash = {}, curr;
for (var i=0;i<myArray.length;i++) {
curr = myArray[i];
hash[curr] = (Number(hash[curr]) || 0) + 1;
}
for (var x in hash) {
if (hash[x] === 1) {
unique.push(x);
}
}
// use unique
var arr = [1,4,5,1,5];
var sorted_arr = arr.sort();
var results = [];
for (var i = 0; i < arr.length - 1; i++) {
if (sorted_arr[i + 1] !== sorted_arr[i]) {
results.push(sorted_arr[i]);
}
}
!==
当前元素时进行push()
,而不是当它们相等时进行。如果数组中有超过2个元素的出现次数(例如[1,1,1,2]
),这种方法也会失败。 - MattjQuery.unique
是用于 DOMNodes 的,根据文档说明:“对 DOM 元素数组进行排序”。 - Matt