Как удалить все элементы isDone === true в объекте массива Javascript?

Я хочу удалить все element со значением isDone === true в массиве list. Но я не знаю, удалить все, я просто удаляю каждый элемент по одному.

Это мой код:

  clearCompleted: function (list) {
    for (var i = 0; i < list.length; i++) {
      if (list[i].isDone === true) {
        list.splice(i, 1);
      }
    }
  },

Пожалуйста, помогите мне решить эту проблему.


person Trần Hạnh    schedule 26.05.2017    source источник
comment
Вы не можете изменить массив, который вы зацикливаете, есть несколько вещей, которые вы можете сделать, чтобы решить эту проблему. См. этот ответ для хороших решений.   -  person aaronw    schedule 26.05.2017


Ответы (1)


Используйте цикл while или do..while, Array.prototype.indexOf(), Array.prototype.find(), чтобы избежать проверки свойства .length исходного массива.

let list = [{isDone:true}, {isDone:false}, {isDone:true}];

while (list.find(({isDone}) => isDone)) {
  list.splice(list.indexOf(list.find(({isDone}) => isDone)), 1)
}

console.log(list);

person guest271314    schedule 26.05.2017
comment
Огромное спасибо. - person Trần Hạnh; 26.05.2017
comment
@TrầnHạnh Шаблон может быть составлен с использованием цикла for for (;list.find(({isDone}) => isDone);) { list.splice(list.indexOf(list.find(({isDone}) => isDone)), 1) }; , в котором используется то же количество символов, что и в цикле while. - person guest271314; 26.05.2017
comment
Спасибо за вашу помощь . Можете ли вы объяснить мне ({isDone}) => isDone)? Я этого не понимаю. - person Trần Hạnh; 26.05.2017
comment
Синтаксис следующий: функция стрелки и деструктуризация объекта. Эквивалентно .find(function(object) {return object.isDone} ) - person guest271314; 26.05.2017
comment
Спасибо за поддержку. Но я только изучаю JavaScript ES5. :( . Эта практика просто использует ES5 - person Trần Hạnh; 26.05.2017
comment
@TrầnHạnh Не уверен, что ты имеешь в виду. Шаблон может быть составлен без использования стрелочной функции, деструктуризации объекта или .find() for (;list.filter(function(o){return o.isDone}).length;) { list.splice(list.indexOf(list.filter(function(o){return o.isDone})[0]), 1) }; - person guest271314; 26.05.2017