Вы хотите отфильтровать вещи из массива. Лучше всего использовать метод 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
Используйте обратный цикл – Saba
Возможный дубликат [Удалить объект из массива с использованием JavaScript] (http://stackoverflow.com/questions/10024866/remove-object-from-array-using-javascript) – laaposto
Ну, проблема в том, что вы выполняете итерацию и одновременное удаление элементов из массива. – Kejt