2017-02-07 2 views
0

мне нужно удалить элемент в массиве Object, посмотрите на мой массив:Удалить элемент в массиве объекта

Я хочу удалить элементы, которые имеют done == true, посмотрите на мой сценарий:

var items = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}]; 
 

 

 
items.forEach((elem, index) => { 
 
    if(items[index].done) { 
 
    items.splice(index, 1); 
 
    } 
 
}) 
 

 
console.log(items)

Но это не работает.

+0

Используйте обратный цикл – Saba

+0

Возможный дубликат [Удалить объект из массива с использованием JavaScript] (http://stackoverflow.com/questions/10024866/remove-object-from-array-using-javascript) – laaposto

+0

Ну, проблема в том, что вы выполняете итерацию и одновременное удаление элементов из массива. – Kejt

ответ

2

Вы хотите отфильтровать вещи из массива. Лучше всего использовать метод filter.

var items = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}] 
 

 
console.log(items.filter(o => !o.done))

Проблема с кодом вы изменяете массив в то время как вы итерацию над ним, поэтому при удалении элемента переложить все элементы, и вы переходите к следующему элементу.

Проверьте следующий фрагмент, и как вы никогда не получить доступ к элементу (D):

var items = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}] 
 

 
var itemsCopy = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}] 
 

 
items.forEach((elem, index) => { 
 
     if (itemsCopy[index].text !== items[index].text) 
 
     console.log('you want to access', itemsCopy[index].text, 'instead you are accessing', items[index].text) 
 
     if(items[index].done) { 
 
     items.splice(index, 1); 
 
     //elem.remove(); 
 
     } 
 
    })

Каждый цикл увеличение индекса 1, так что, когда вы снимаете c элемент (индекс 2), тогда индекс становится 3. Но поскольку вы удалили c, теперь ваш массив выглядит так:

[a, b, d, e]

Поэтому вы обращаетесь к элементу e, а не d, потому что теперь d имеет индекс 2

+0

Это не отвечает на вопрос OP (а именно - он изменяет массив во время итерации по нему) – lustoykov

3

Это не будет работать, потому что ваш являются перебором и модификации того же массива. При удалении элемента с индексом 1, элемент с индексом 2 стал индексом 1, но ваш forEach будет продолжать перебирать и не будет проверять новый индекс 1

Вы можете просто использовать Array.prototype.filter()

var items = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}]; 
 

 
items = items.filter(function(elem){ 
 
    return !elem.done; 
 
}); 
 

 
console.log(items);

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