【发布时间】:2010-09-10 14:15:48
【问题描述】:
我有一个数字数组,例如:[1, 4, 7, 1, 2, 1, 3, 1, 4]。
我想删除重复元素并对结果进行排序,即要求的结果是:[1, 2, 3, 4, 7]。
是否有任何内置的 Javascript/jQuery 函数可以做到这一点,或者我必须自己编写?
【问题讨论】:
标签: javascript jquery arrays unique
我有一个数字数组,例如:[1, 4, 7, 1, 2, 1, 3, 1, 4]。
我想删除重复元素并对结果进行排序,即要求的结果是:[1, 2, 3, 4, 7]。
是否有任何内置的 Javascript/jQuery 函数可以做到这一点,或者我必须自己编写?
【问题讨论】:
标签: javascript jquery arrays unique
不,没有任何内置功能。另外,您需要注意默认排序是词法的,所以[9, 1, 10].sort() 将返回[1, 10, 9]。
以下内容将对数字数组中的重复项进行排序和删除:
function sortAndRemoveDuplicates(arr) {
arr.sort( function(a, b) { return a - b; } );
var copy = arr.slice(0);
arr.length = 0;
for (var i = 0, len = copy.length; i < len; ++i) {
if (i == 0 || copy[i] != copy[i - 1]) {
arr.push(copy[i]);
}
}
return arr;
}
var arr = [1, 4, 7, 1, 2, 1, 3, 10, 1, 4, 10];
sortAndRemoveDuplicates(arr);
console.log(arr); // [1, 2, 3, 4, 7, 10]
【讨论】:
Underscore library 非常适合所有这些技巧;我喜欢它,没有它就活不下去!!
一旦你声明了它,你就可以使用下划线来调用它的函数,像这样:
_.uniq([1, 4, 7, 1, 2, 1, 3, 1, 4]);
=> [1, 4, 7, 2, 3]
如果你想要它排序:
_.uniq([1, 4, 7, 1, 2, 1, 3, 1, 4]).sort();
=> [1, 2, 3, 4, 7]
从上面链接的页面:
“Underscore 提供了 60 多种函数,它们支持常见的功能怀疑:map、select、invoke — 以及更专业的帮助器:函数绑定、javascript 模板、深度相等测试等。”
【讨论】:
uniq 所做的事情,为什么不把它拉出来解决他的问题,然后指出所有这些和更多可以在图书馆找到? :-)
Array.prototype.unique = function(){
for(var i = 0; i < this.length; i++){
if( this.indexOf(this[i], i+1) != -1 ){
this.splice(i,1);
i--;
}
}
return this.sort();
}
var x = [1,'x', 4, 7, 1, 2, 1,'x', 3, 1, 4];
x.unique() // [1, 2, 3, 4, 7, "x"]
【讨论】:
从 JavaScript 1.6 开始,array.filter() 可用于删除重复值:
[1, 4, 7, 1, 2, 1, 3, 1, 4]
.filter(function (value, index, self) {
return self.indexOf(value) === index;
});
返回
[1, 4, 7, 2, 3]
过滤器的好处是它适用于数组中的所有值类型:
[1, "d", 4, "e", 7, "e", 1, "a", 2, "d", 1, "b", 3, "c", 1, "e", 4]
.filter(function (value, index, self) {
return self.indexOf(value) === index;
});
返回
[1, 2, 3, 4, 7, "a", "b", "c", "d", "e"]
【讨论】: