> Что такое map, filter и reduce в JavaScript и в чем их отличие (JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: ООО Премиум ИТ Солюшен, The Tribe
Стек: JavaScript
> Пример ответа
Короткий ответ
map, filter и reduce - это методы массива в JavaScript для функциональной обработки данных. map преобразует каждый элемент и возвращает новый массив той же длины. filter отбирает элементы по условию и возвращает новый массив меньшей или равной длины. reduce сворачивает массив в одно значение, аккумулируя результат на каждом шаге. Главное отличие - в цели: трансформация, фильтрация или агрегация. Все три не мутируют исходный массив.
Подробное объяснение
Все три метода появились в ES5 и работают одинаково: принимают callback-функцию и вызывают её для каждого элемента массива. Callback получает три аргумента: текущий элемент, индекс и сам массив. Ни один из методов не изменяет исходный массив - они возвращают новый результат.
map - применяет функцию к каждому элементу и возвращает новый массив с результатами. Длина результата всегда равна длине исходного массива. Используется для преобразования данных: например, извлечение поля из объектов, изменение формата, математические операции.
filter - проверяет каждый элемент на соответствие условию (callback возвращает true или false) и возвращает новый массив только с теми элементами, для которых условие истинно. Длина результата может быть меньше исходной. Используется для отбора данных по критериям.
reduce - проходит по массиву и накапливает результат в аккумуляторе. Callback принимает четыре аргумента: аккумулятор, текущий элемент, индекс и массив. Вторым аргументом reduce принимает начальное значение аккумулятора. Если начальное значение не указано, аккумулятором становится первый элемент, а обход начинается со второго. Используется для вычисления суммы, произведения, построения объектов, группировки и других агрегаций.
Ключевое отличие - семантика: map - "преобразовать каждый", filter - "оставить подходящие", reduce - "свести к одному значению". reduce - самый мощный, через него можно выразить и map, и filter, но это не рекомендуется из-за читаемости.
На практике
В реальной работе эти методы часто комбинируют в цепочки. Типичный паттерн: сначала filter для отбора, затем map для преобразования, и при необходимости reduce для агрегации. Это позволяет писать декларативный код без промежуточных переменных и циклов.
Важно помнить про производительность: каждый вызов создаёт новый массив, поэтому для очень больших массивов цепочки могут быть менее эффективны, чем один цикл. Но в подавляющем большинстве frontend-задач это некритично.
Также стоит знать, что reduce можно использовать не только для чисел: с его помощью строят объекты, объединяют строки, группируют данные по ключам.
Пример кода
JAVASCRIPTconst numbers = [1, 2, 3, 4, 5, 6];// map - удваиваем каждый элементconst doubled = numbers.map(n => n * 2);// [2, 4, 6, 8, 10, 12]// filter - оставляем только чётныеconst evens = numbers.filter(n => n % 2 === 0);// [2, 4, 6]// reduce - суммируем все элементыconst sum = numbers.reduce((acc, n) => acc + n, 0);// 21// Комбинация: сумма квадратов чётных чиселconst result = numbers.filter(n => n % 2 === 0).map(n => n * n).reduce((acc, n) => acc + n, 0);// 4 + 16 + 36 = 56// reduce для построения объектаconst fruits = ['apple', 'banana', 'apple', 'orange', 'banana'];const count = fruits.reduce((acc, fruit) => {acc[fruit] = (acc[fruit] || 0) + 1;return acc;}, {});// { apple: 2, banana: 2, orange: 1 }
Как отвечать на собеседовании
Начни с краткого определения каждого метода и их назначения. Затем переходи к сравнению: подчеркни, что map возвращает массив той же длины, filter - подмножество, reduce - одно значение. Приведи простой пример для каждого. Если спросят про reduce подробнее - объясни про аккумулятор и начальное значение. Хорошо показать комбинацию методов в цепочке. Упомяни, что все методы иммутабельны. Если уровень позволяет, добавь, что reduce универсален и может заменить map и filter, но это ухудшает читаемость.
Что проверяет интервьюер
Интервьюер проверяет базовое понимание функционального подхода в JavaScript: знает ли кандидат сигнатуры методов, понимает ли разницу между трансформацией, фильтрацией и агрегацией, умеет ли читать и писать цепочки вызовов. Также проверяется понимание иммутабельности и умение работать с callback-функциями. Для junior достаточно уверенного объяснения и простых примеров.
Типичные ошибки
- Путать
mapиforEach:mapвозвращает новый массив,forEach-undefined. - Забывать передать начальное значение в
reduceдля пустого массива - будет ошибка. - Использовать
filterдля преобразования элементов - это задачаmap. - Мутировать исходный массив внутри callback - нарушение иммутабельности.
- Не возвращать значение из callback в
map- получится массив изundefined. - Пытаться использовать
reduceдля простых задач, где достаточноmapилиfilter- код становится менее читаемым.
> Похожие задачи по frontend
Почему setTimeout выполняется после микрозадач в JavaScript
В чем разница Promise.all и Promise.allSettled в JavaScript и что происходит если один промис падает
Для чего нужны и как работают методы массивов map, filter и reduce в JavaScript
Что будет при обращении к переменной var до объявления в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью