Javascript Array.splice() удаляет не все элементы

Рейтинг: 0Ответов: 3Опубликовано: 13.02.2023

Есть список пользователей, у которых есть свойство deleted, требуется написать функцию, которая удалит из списка всех удаленных пользователей.
В цикле использовал метод splice, но он почему-то работает выборочно.
Так же пробовал использовать delete, он сработал хорошо, но оставил <empty list>.

Код и результат

Ответы

▲ 2

.splice меняет ваш массив, в т.ч. и сдвигает элементы. Поэтому итератор просто проходит мимо некоторых элементов. Выходит такое поведение:

1)
Victor, deleted: false <-- iterator, i = 0, не удаляет
Misha, deleted: true
Alexey, deleted: true
Misha, deleted: false

2)
Victor, deleted: false 
Misha, deleted: true <-- iterator, i = 1, удаляет
Alexey, deleted: true
Misha, deleted: false

Misha удален, на его место становится Alexey. А iterator идет дальше

3)
Victor, deleted: false 
Alexey, deleted: true - пропущен
Misha, deleted: false <-- iterator, i = 2, не удаляет

Я бы рекомендовал отказаться от .splice в случаях, когда мы изменяем массив, по которому и проходимся и вместо этого создавать новый. Есть варианты:

// 1, добавлять элементы в новый массив
const result = [];
users.forEach(user => {
  if (!user.deleted) {
    result.push(user);
  }
})

// 2, использовать метод .filter. Он более предпочтительный
const result = users.filter(user => !user.deleted);

Про .filter подробнее тут

▲ -1
const users = [
  { name: 'Victor', deleted: false },
  { name: 'Misha', deleted: true },
  { name: 'Alexey', deleted: true },
  { name: 'Misha', deleted: false },
  { name: 'Oleg', deleted: true },
  { name: 'Andrey', deleted: true },
];

const updateData = (data) => {
  return data.filter((item) => !item.deleted);
};

const updateUsers = updateData(users);

console.log(updateUsers);

Можете использовать функцию с возвратом нового массива объектов, при этом не изменяя оригинальный массив данных. При помощи метода filter отфильтровав нужные вам данные. Обратите внимание что в данном коде внутри метода filter используется неявный возврат.

▲ -3
users = users.filter(el => !el.deleted) вот такой код будет

функция в теории может даже ничего не принимать в себя а просто ссылаться через this