На всякий случай вы пропустили вопрос об удалении дубликатов в массиве 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];//we have dup(s) on the left of the last element
корпус B:
... ,7,9,10];//we don't have dup(s) on the left of the last element
Если вы действительно понимаете, что происходит, вы будете знать, что мы не добавили 9
в случае A. Поэтому мы хотим добавить последний элемент независимо от того, находимся ли мы в случае 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]);
Я действительно потерян, любая помощь приветствуется