提醒一下,这个问题是关于如何在已排序的
数组中删除重复项。相比于未排序的数组,可以应用非常快速的算法来移除重复项。
- 如果您已经知道如何删除已排序数组中的重复项,则可以跳过此部分。
示例:
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];
*排序可以是升序或降序,也可以按其他奇怪的方法进行,但重要的是每个重复的项都在一起。
我们停在array.length-1,因为没有东西可以检查了。
然后我们添加最后一个元素,而不考虑任何因素,因为:
情况A:
... ,9,9,9] //我们在最后一个元素左边有重复项
情况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]);
我真的很迷茫,需要帮助。