给出一个 ['0','1','1','2','3','3','3']
数组,结果应为 ['0','1','2','3']
。
给出一个 ['0','1','1','2','3','3','3']
数组,结果应为 ['0','1','2','3']
。
编辑过的
ES6解决方案:
[...new Set(a)];
替代选择:
Array.from(new Set(a));
旧响应。O(n^2)(不要在大型数组上使用它!)
var arrayUnique = function(a) {
return a.reduce(function(p, c) {
if (p.indexOf(c) < 0) p.push(c);
return p;
}, []);
};
如果你想保持秩序:
arr = arr.reverse().filter(function (e, i, arr) {
return arr.indexOf(e, i+1) === -1;
}).reverse();
由于没有内置的反向indexOf,我将数组反转,过滤掉重复项,然后重新反转它。
过滤函数查找当前索引之后的任何元素出现(在原始数组中之前)。如果找到一个,就会丢弃此元素。
编辑:
或者,您可以使用lastIndexOf(如果您不关心顺序):
arr = arr.filter(function (e, i, arr) {
return arr.lastIndexOf(e) === i;
});
这将保留唯一的元素,但只保留最后一次出现的元素。这意味着 ['0','1','0'] 变成了 ['1','0'],而不是 ['0','1']。
[1,2,3,1,1].filter(function(elem,idx,arr){ return arr.indexOf(elem) >= idx; });
,因为它更加直观易懂。 - Benjamin Gruenbaum这是一个数组原型函数:
Array.prototype.unique = function() {
var unique = [];
for (var i = 0; i < this.length; i++) {
if (unique.indexOf(this[i]) == -1) {
unique.push(this[i]);
}
}
return unique;
};
现在是2014年,时间复杂度仍然很重要!
array.filter(function() {
var seen = {};
return function(element, index, array) {
return !(element in seen) && (seen[element] = 1);
};
}());
function array_unique(arr) {
var result = [];
for (var i = 0; i < arr.length; i++) {
if (result.indexOf(arr[i]) == -1) {
result.push(arr[i]);
}
}
return result;
}
这不是一个内置函数。如果产品列表中不包含该项,则将其添加到唯一列表中并返回唯一列表。
好的!不用谢!
Array.prototype.unique = function()
{
var tmp = {}, out = [];
for(var i = 0, n = this.length; i < n; ++i)
{
if(!tmp[this[i]]) { tmp[this[i]] = true; out.push(this[i]); }
}
return out;
}
var a = [1,2,2,7,4,1,'a',0,6,9,'a'];
var b = a.unique();
alert(a);
alert(b);
你可以在这里找到各种不同的数组去重实现方式:
http://jsperf.com/distinct-hash-vs-comparison/12
http://jsperf.com/array-unique-functional
我更喜欢函数式编程风格,例如:
var arr = ['lol', 1, 'fdgdfg', 'lol', 'dfgfg', 'car', 1, 'car', 'a', 'blah', 'b', 'c', 'd', '0', '1', '1', '2', '3', '3', '3', 'crazy', 'moot', 'car', 'lol', 1, 'fdgdfg', 'lol', 'dfgfg', 'car', 1, 'car', 'a', 'blah', 'b', 'c', 'd', '0', '1', '1', '2', '3', '3', '3', 'crazy', 'moot', 'car', 'lol', 1, 'fdgdfg'];
var newarr = arr.reduce(function (prev, cur) {
//console.log(prev, cur);
if (prev.indexOf(cur) < 0) prev.push(cur);
return prev;
}, []);
var secarr = arr.filter(function(element, index, array){
//console.log(element, array.indexOf(element), index);
return array.indexOf(element) >= index;
});
//reverses the order
var thirdarr = arr.filter(function (e, i, arr) {
//console.log(e, arr.lastIndexOf(e), i);
return arr.lastIndexOf(e) === i;
});
console.log(newarr);
console.log(secarr);
console.log(thirdarr);
以下是从数组中去除重复值的方法。
function ArrNoDupe(dupArray) {
var temp = {};
for (var i = 0; i < dupArray.length; i++) {
temp[dupArray[i]] = true;
var uniqueArray = [];
for (var k in temp)
uniqueArray.push(k);
return uniqueArray;
}
}
function array_unique(nav_array) {
nav_array = nav_array.sort(function (a, b) { return a*1 - b*1; });
var ret = [nav_array[0]];
// Start loop at 1 as element 0 can never be a duplicate
for (var i = 1; i < nav_array.length; i++) {
if (nav_array[i-1] !== nav_array[i]) {
ret.push(nav_array[i]);
}
}
return ret;
}
array_unique
的好实现,因为你依赖于它是数值类型。即使对于数字数组去重,我认为parseInt会是更好的方式(但我可能错了)。 - Raekye