> В чем разница между filter и slice для удаления элементов в JavaScript? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Black Wall Group (BWG)

Стек: JavaScript

> Пример ответа

Короткий ответ

filter создаёт новый массив, включающий только элементы, прошедшие проверку в callback-функции, не изменяя исходный массив. slice возвращает копию части массива на основе индексов начала и конца, не удаляя элементы из оригинала. Для удаления элементов filter подходит лучше, так как он явно предназначен для фильтрации по условию, а slice - для извлечения непрерывного диапазона.

Подробное объяснение

filter - это метод массива, который принимает callback-функцию, вызываемую для каждого элемента. Если callback возвращает true, элемент включается в новый массив; если false - исключается. Это иммутабельный подход, подходящий для удаления по произвольному условию (например, все числа больше 10).

slice - это метод, который возвращает новый массив, содержащий элементы с индекса start до end (не включая end). Он не предназначен для удаления по условию, а только для извлечения непрерывного подмассива. Для удаления конкретных элементов с помощью slice нужно комбинировать несколько вызовов, что менее читаемо и эффективно.

Ключевые различия:

  • filter удаляет по условию, slice - по позиции.
  • filter может удалять произвольные элементы, slice - только последовательные.
  • filter требует callback, slice - только индексы.
  • Оба не мутируют исходный массив.

На практике

Для удаления элементов по логическому условию (например, удалить все объекты с active: false) используйте filter. Для удаления одного или нескольких элементов по индексу (например, удалить третий элемент) проще использовать splice (мутирует) или комбинацию slice и spread-оператора (иммутабельно). slice редко применяется для удаления - это скорее инструмент для копирования или извлечения подмассива.

Пример кода

JAVASCRIPT
const arr = [1, 2, 3, 4, 5];
// filter - удаляем элементы больше 3
const filtered = arr.filter(item => item <= 3);
console.log(filtered); // [1, 2, 3]
// slice - удаляем элемент по индексу (иммутабельно)
const indexToRemove = 2;
const sliced = [...arr.slice(0, indexToRemove), ...arr.slice(indexToRemove + 1)];
console.log(sliced); // [1, 2, 4, 5]
// slice для удаления диапазона
const removedRange = [...arr.slice(0, 1), ...arr.slice(3)];
console.log(removedRange); // [1, 5]

Как отвечать на собеседовании

Начни с чёткого определения обоих методов. Подчеркни, что filter - это декларативный способ удаления по условию, а slice - низкоуровневый инструмент для работы с индексами. Упомяни, что filter иммутабелен, а slice тоже не мутирует, но для удаления требует дополнительных операций. Приведи пример, когда filter удобнее (удаление по свойству объекта), и когда slice может быть оправдан (удаление по индексу в иммутабельном стиле). Избегай сравнения с splice, если не спросят - это мутирующий метод.

Что проверяет интервьюер

Интервьюер оценивает понимание базовых методов массивов, их семантики и области применения. Важно показать, что ты различаешь декларативный (filter) и императивный (slice) подходы, знаешь про иммутабельность и умеешь выбирать правильный инструмент для задачи. Также проверяется способность объяснить trade-off между читаемостью и производительностью.

Типичные ошибки

  • Утверждение, что slice удаляет элементы - он только копирует.
  • Попытка использовать slice для удаления по условию без комбинации с filter.
  • Путаница с splice (мутирует) и slice (не мутирует).
  • Игнорирование того, что filter всегда возвращает новый массив, что может быть неэффективно для больших данных.
  • Непонимание, что slice с одним аргументом копирует до конца массива, а не удаляет.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью