例如,我有一个这样的数组;
var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10]
如果重复元素,请将其完全删除
var arr = [1, 3, 4, 6, 8, 9]
任何提示,链接或代码示例都很有用
提前谢谢你!
答案 0 :(得分:5)
过滤出多于1个索引的项目
var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10];
arr = arr.filter(function (item, index, arr) {
return arr.indexOf(item) == arr.lastIndexOf(item);
});
arr
/* returned value: (Array)
1,3,4,6,8,9
*/
答案 1 :(得分:2)
不需要库,ES ed 3支持就足够了。如果数组按OP排序,则:
function removeDups(a) {
var i = a.length && a.length - 1;
while (i) {
if (a[i] == a[--i]) {
a.splice(i, 1);
}
}
// Not required, but convenient
return a;
}
要使用未排序的数组“完全”删除所有重复项(使用原始值或对象值),请考虑:
// Removes duplicated elements comlpetely,
// e.g. [1,1,2,3,3] => [2]
// Requires ES5 Array.prototype.indexOf
function removeDupsUnsorted(a) {
var i = a.length;
var idx, v;
while (--i > -1) {
v = a[i];
idx = a.indexOf(v);
if (idx != i) {
do {
a.splice(idx, 1);
idx = a.indexOf(v);
i--;
} while (idx != -1)
++i;
}
}
return a;
}
答案 2 :(得分:1)
这可能是一个O(n)解决方案,假设属性查找和插入是O(1):
var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10];
var included = arr.reduce( function(a,b) {
a[b] = a[b]===undefined; return a}, {} );
arr.filter( function(c) { return included[c]; } )
// [1, 3, 4, 6, 8, 9]
使用直接for
循环实际上更快,而不是reduce
和filter
:
function removeDups5(a) {
var included = {}, i;
for( i=0 ; i<a.length ; ++i ) included[a[i]] = a[i] in included;
for( --i ; 0<=i ; --i ) if(included[a[i]]) a.splice(i,1);
return a;
}
这是jsperf将这些答案中的一些相互比较。这个解决方案目前处于领先地位,看起来阵列的时间越长。 (任何人都可以随意添加您的解决方案。)
答案 3 :(得分:0)
您可以使用filter:
var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10];
arr = arr.filter(function (item, index, arr) {
return arr.indexOf(item) == arr.lastIndexOf(item);
});
console.log(arr); // [1, 3, 4, 6, 8, 9]
<强> Fiddle Demo 强>
答案 4 :(得分:0)
假设arr已排序,这是一个O(n)解决方案。
var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10]; //Make sure it's sorted!
var no_add;
var other = [];
other.push(arr[0]);
for (var i = 1; i < arr.length; i++)
{
if(no_add == arr[i])
continue;
if(other[other.length - 1] == arr[i])
{
no_add = other.pop();
continue;
}
else
other.push(arr[i]);
}
console.log(other); //[1, 3, 4, 6, 8, 9]
答案 5 :(得分:0)
我有点累了,但这也应该可以解决问题(ECMA5)并且原始顺序无关紧要。
的Javascript
var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10];
arr = arr.filter(function (value, index, array) {
return (!this[value] && array.lastIndexOf(value) === index) || !(this[value] = true);
}, {});
console.log(JSON.stringify(arr));
输出
[1,3,4,6,8,9]上