2012-04-22 4 views
1

У меня есть массив:Удалить массив индексов из массива JavaScript

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] 

и у меня есть массив индексов, которые я хочу, чтобы удалить:

var remove = [1, 3, 5] 

так, что результат:

arr ==== ['A', 'C', 'E', 'G'] 

Я не могу сделать это с сращивания в цикле:

// WRONG 
for (i = 0, l = remove.length; i < l; i++) { 
    arr.splice(remove[i]); 
} 

потому что после каждой итерации индекс каждого элемента изменился.

Так как я могу это сделать?

+1

Начало в конце массива и работа назад? –

+1

Сортируйте свой удаляемый массив, чтобы клавиши находились в порядке убывания, поэтому вы работаете с BACK массива 'arr'. (Это или сортировка в порядке возрастания, затем цикл в обратном порядке). –

ответ

2
> arr.filter(function(x,i){return remove.indexOf(i)==-1}) 
["A", "C", "E", "G"] 

Для того, чтобы быть более эффективным, конвертировать remove в объект/хэш-таблицы во-первых, например, так:

var removeTable = {} 
remove.forEach(function(x){removeTable[x]=true}) 

> arr.filter(function(x,i){return removeTable[i]}) 
["A", "C", "E", "G"] 
1

граф назад:

// RIGHT 
for (i = (remove.length-1); i >= 0; i--) { 
    arr.splice(remove[i]); 
} 
+1

Это предполагает, что в удаляемом массиве нет дубликатов и сортируется. Если массив удаления был отсортирован в обратном порядке, все равно будет иметь ту же проблему, что и раньше. Кроме того, частью инициализации цикла for должно быть 'i = remove.length - 1' – ricochet1k

+0

Обновлено для' length-1'. И да, я предположил, что это произошло на основе пользовательской почты, но это справедливо. – Marc

1

начать цикл от последнего и удалить элементы от наивысшего индекса сначала.

2

Чтобы не изменить свое мышление слишком много - начните с конца.

ABCDE F ..

При удалении элемента 5, он становится ..

ABCDE

Затем удалить элемент 3, он становится ..

ABCE

Это именно то, что вы хотите.

0

В качестве альтернативного варианта вы можете использовать .push() для отправки элементов, которые хотите сохранить в третьем массиве. См. Раздел here. Это позволит вам сохранить исходный массив неповрежденным, хотя кажется, что вы этого не хотите/должны сделать.

Смежные вопросы