Javascript Array.splice() удаляет не все элементы
Есть список пользователей, у которых есть свойство deleted, требуется написать функцию, которая удалит из списка всех удаленных пользователей.
В цикле использовал метод splice, но он почему-то работает выборочно.
Так же пробовал использовать delete, он сработал хорошо, но оставил <empty list>.
Ответы (3 шт):
users = users.filter(el => !el.deleted) вот такой код будет
функция в теории может даже ничего не принимать в себя а просто ссылаться через this
.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 подробнее тут
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 используется неявный возврат.
