以防万一您错过了,问题是关于删除 sorted
数组上的重复项。这可以应用非常快速的算法(与未排序的数组相比)来删除重复项。
- 如果您已经知道如何删除 SORTED 数组中的重复项,则可以跳过此部分
示例:
var out=[];
for(var i=0,len=arr.length-1;i<len;i++){
if(arr[i]!==arr[i+1]){
out.push(arr[i]);
}
}
out.push(arr[i]);
看到了吗,它非常快。我将尝试解释刚刚发生的事情。
排序后的数组*可能如下所示:
arr=[0,1,1,2,2,3,4,5,5,6,7,7,8,9,9,9];
*排序可以是 ASC 或 DESC,或者其他奇怪的方法,但重要的是每个重复的项目都是相邻的。
我们在 array.length-1
处停止,因为我们没有任何要检查的内容
然后我们不顾一切地添加了最后一个元素,因为:
案例A:
... ,9,9,9];//我们在最后一个元素的左边有 dup(s)
情况 B:
... ,7,9,10];//最后一个元素的左边没有重复项
如果你真的了解发生了什么,你就会知道我们没有在案例 A 上添加任何 9
。因此,无论是否添加,我们都想添加最后一个元素在案例 A 或 B 上。
问题:
这说明了,我想做同样的事情,但在以下情况下忽略 undefined
值:
var arr=[];arr[99]=1;//0 through 98 are undefined, but do NOT hold the undefined value
我想删除那些。如果我有一些真正的 undefined
值,则不应删除这些值。
我糟糕的尝试是这个:
var out=[];
for (var i=0,len=arr.length; i < len - 1;) {
var x = false;
var y = false;
for (var j = i, jo; j < len - 1; j++) {
if (j in arr) {
x = true;
jo = arr[j];
i = j + 1;
break;
}
}
if (x == false) {
break;
}
for (var u = i, yo; u < len - 1; u++) {
if (u in arr) {
y = true;
yo = arr[u];
i = u + 1;
break;
}
}
if (y == false) {
out.push(jo);
break;
}
if (jo !== yo) {
out.push(jo);
}
}
out.push(arr[len - 1]);
我真的迷路了,感谢任何帮助
最佳答案
使用 .filter() 的现代单行代码
arr.filter((e, i, a) => e !== a[i - 1]);
我对这里其他答案的复杂性感到非常惊讶,即使是那些使用 .filter()
即使使用没有箭头函数的老式 ES5 语法:
arr.filter(function (e, i, a) { return e !== a[i - 1] });
例子:
let a = [0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 9];
let b = arr.filter((e, i, a) => e !== a[i - 1]);
console.log(b); // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
如果您需要就地改变数组,那么只需使用:
arr = arr.filter((e, i, a) => e !== a[i - 1]);
我个人建议不要使用此处其他答案中的复杂解决方案。
关于javascript - 删除排序数组中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9355403/