2015-08-12 3 views
-1

Я хочу удалить все совпадения в массиве, у меня есть функция, в которой я отправляю значение, и через все совпадения в массиве, и я удаляю, если они существуют, но изменение массива для каждого splice, пожалуйста, посмотрите это Лил примерJavascript Удалить совпадение в массиве

var cars = ["Saab","Saab","Saab", "Volvo", "BMW","Volvo","Volvo", "BMW", "BMW", "BMW","Volvo"]; 

     for(j =0;j<cars.length;j++){     
       if(cars[j]=="Volvo"){ 
        cars.splice(j, 1); 
       } 
     } 
console.log(cars); 

результат

["Saab", "Saab", "Saab", "BMW", "Volvo", "BMW", "BMW", "BMW"] 
+1

Что делать, если вы инвертировать задачу - создать еще один массив только с содержанием вам нужно? Было бы намного проще. 'var carsWithoutVolvo = cars.filter (функция (автомобиль) {return car! = 'Volvo';});' – zerkms

+0

, что звук хороший, но мне нужно знать, могу ли я найти другое решение – jearca

+3

По какой причине? Ваше решение сложнее. – zerkms

ответ

4

Поскольку индексы могут получить перепутано, когда цикл от начала до конца массива и удаления элементов, как правило, лучше идти назад:

var i = cars.length - 1; 

while(i >= 0) { 
    if(/* condition */) { 
    cars.splice(i, 1); 
    } 

    i--; 
} 

Я ненавижу родные петли, хотя (без причины, просто личные предпочтения), поэтому я предпочитаю использовать семантический forEach/reduce/map/filter.

filter на самом деле наиболее семантический здесь (следующий, может быть reduce):

var filteredCars = cars.filter(notVolvo); 

function notVolvo(car) { 
    return car !== 'Volvo'; 
} 

Если для пинков и хихиканья, вы хотите использовать reduce, вы могли бы сделать:

var reducedCars = cars.reduce(notVolvo, []); 

function notVolvo(aggregate, car) { 
    return car === 'Volvo' ? aggregate : aggregate.concat([car]); 
} 
+1

Не следует ли начинать с 'cars.length - 1'? – Oriol

+0

, которые работают ... спасибо, Джош, я искал что-то вроде этого, мне не нравятся легкие вещи xD! – jearca

+0

«Мне не нравятся легкие вещи» --- это глупый аргумент – zerkms

0

проблема в том, что, когда вы используете splice для удаления предмета, следующие предметы будут перемещены на одну позицию назад, чтобы не было пробелов.

Однако ваша петля увеличивает индексную переменную независимо от того, был ли элемент удален или нет. Это означает, что при удалении элемента следующий будет пропущен.

Это может быть исправлен, противодействуя приращение с декрементом:

for (var i=0; i<cars.length; i++) 
    if (cars[i] == "Volvo") 
    cars.splice(i--, 1); 
Смежные вопросы