2017-01-18 5 views
0

Я пытаюсь удалить элементы из списка, если выполнено условие.Как удалить элемент в цикле forEach, не останавливая траверс

var my_list = [ 
{ 'a': 1, 'b': 2 }, 
{ 'a': 3, 'b': 4 } 
]; 

my_list.forEach(function (item){ 

    if (item.a == '1') { 

     // Side note : I'm using Lodash to remove the item 

     _.pull(my_list, item); 

    } 

}); 

// The above forEach runs once, instead of twice. 

Проблема заключается в том, что когда я удалить элемент из списка, цикл Foreach пропускает 1 шаг и не пересекать другие элементы (Очевидно, потому что я мутирует исходный массив).

Моя цель - получить список как исходный массив, но исключая все удаленные элементы.

Как я должен это решить?

ответ

1

Вы можете использовать lodash _.clone

var my_list = [ 
{ 'a': 1, 'b': 2 }, 
{ 'a': 3, 'b': 4 } 
]; 

_.clone(my_list).forEach(function (item){ 

    if (item.a == '1') { 

     // Side note : I'm using Lodash to remove the item 

     _.pull(my_list, item); 

    } 

}); 

Вы также можете использовать _.filter метод - я думаю, что это будет лучшим решением.

var filteredMyList= _.filter(my_list, function(obj){ 
    return obj.a != 1 
}); 
+0

Nice one ..! Не уверен, почему я не думал об этом. Чистый и простой – xperator

0

Если вы используете lodash и единственное, что вы используете цикл Foreach для фильтрует почему бы не использовать lodash метод фильтра?

var my_list = [ 
    { 'a': 1, 'b': 2 }, 
    { 'a': 3, 'b': 4 } 
]; 

var my_filtered_list = _.filter(my_list, function(o){ 
    return o.a != 1 
}); 
1

это сделать в обратном порядке:

for (var i = my_list.length; i >= 0; i--) { 
    //removing an item will not disturb the count 
} 
0

Разве это не классическое использование "фильтр"? Не нужно использовать цикл (и в эти дни вы, вероятно, не должны, если у вас нет особых причин ... функциональности и всего этого).

var my_list = [ 
{ 'a': 1, 'b': 2 }, 
{ 'a': 3, 'b': 4 } 
]; 

my_list = my_list.filter (item => { return item.a !== '1' }); 

Когда фильтр возвращает false, этот элемент не будет находиться в новом списке.

1

Если вы можете использовать простой for loop, то все, что вам нужно запомнить, это смещение index после вас splice.

var my_list = [ 
 
    { 'a': 1, 'b': 2 }, 
 
    { 'a': 3, 'b': 4 } 
 
]; 
 
//Remove in standard for loop 
 
for (var index = 0; index < my_list.length; index++) { 
 
    var item = my_list[index]; 
 
    if (item.a == 1) { 
 
     //Remove element 
 
     my_list.splice(index, 1); 
 
     //Offset index 
 
     index--; 
 
    } 
 
} 
 
console.log(my_list);

EDIT

Brainfart .. Это то, что Array.prototype.filter для.

var my_list = [ 
 
    { 'a': 1, 'b': 2 }, 
 
    { 'a': 3, 'b': 4 } 
 
]; 
 
var my_list = my_list 
 
    .filter(function myFilterFunction(item) { 
 
    return item.a != 1; 
 
}); 
 
console.log(my_list);

1

Если ваше намерение просто удалить элементы из списка, то lodash обеспечивает remove функцию:

_.remove(my_list, {a: 1}); 

Это Виль мутировать my_list. Если вы хотите получить новый список, используйте reject: