В чем разница между filter и slice для удаления элементов в JavaScript?
Что проверяют
Знаете ли вы, какие методы массива мутируют исходник, а какие возвращают копию, и умеете ли выбрать способ удаления под задачу: по условию или по индексу. Следом почти всегда спрашивают про splice и про то, почему в React состояние нельзя менять на месте.
Как отвечать
Начните с того, что оба метода исходный массив не трогают и возвращают новый, но отбирают элементы по разным признакам:
filter(cb): проходит весь массив и оставляет элементы, для которых колбэк вернул истину. Удаляет по значению или условию, причём все совпадения сразу:items.filter(item => item.id !== id);slice(start, end): вырезает кусок по индексам,endне включается, отрицательные индексы считаются с конца. Удалить им элемент можно только склейкой двух кусков:[...arr.slice(0, i), ...arr.slice(i + 1)];splice(start, count): единственный из тройки меняет исходный массив и возвращает удалённые элементы;toSpliced(start, count): появился в ES2023, делает то же, чтоsplice, но возвращает копию. Удаление по индексу без мутации в одну строку:arr.toSpliced(i, 1).
Итог для собеседования: удаляете по условию, берите filter; знаете индекс, берите toSpliced или filter((_, idx) => idx !== i); нужно убрать элемент из большого массива без лишней копии, тогда splice. В React и Redux мутация запрещена, потому что изменения определяются сравнением ссылок, и компонент просто не перерисуется.
Добавьте, что копия поверхностная: объекты внутри нового массива те же самые, и изменение newArr[0].name заденет старый массив.
Где спотыкаются
Путают slice и splice. Разница в одну букву, а поведение противоположное: splice в обработчике React-компонента портит состояние незаметно, до первого бага с перерисовкой.
Удаляют «первое вхождение» через filter и получают удаление всех одинаковых значений. Для первого вхождения нужен индекс через indexOf или findIndex.
Не проверяют результат indexOf. Если элемента нет, индекс равен -1: склейка [...arr.slice(0, -1), ...arr.slice(0)] вернёт массив почти двойной длины, а splice(-1, 1) молча удалит последний элемент.