Имитация метода Array.prototype.filter с использованием reduce

В reduce накапливайте новый массив и добавляйте элемент только при truthy-результате предиката. Начальное значение аккумулятора — пустой массив.

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

Что ответить на собеседовании

В reduce накапливайте новый массив и добавляйте элемент только при truthy-результате предиката. Начальное значение аккумулятора — пустой массив.

Подробный разбор

Ответ с пояснениями

Условие

Напишите функцию, которая воспроизводит работу стандартного метода Array.prototype.filter, применяя при этом метод reduce для отбора нужных элементов массива. Функция должна принимать массив и предикат‑функцию, возвращать новый массив, содержащий только те элементы, для которых предикат вернул true.

Ответ

В reduce накапливайте новый массив и добавляйте элемент только при truthy-результате предиката. Начальное значение аккумулятора — пустой массив.

function filterWithReduce(array, predicate, thisArg) {
  if (typeof predicate !== 'function') throw new TypeError('Нужен callback');
  return array.reduce((result, value, index, source) => {
    if (predicate.call(thisArg, value, index, source)) result.push(value);
    return result;
  }, []);
}

Исходный массив сама функция не меняет, дыры пропускаются правилами reduce. Push изменяет только новый аккумулятор; копирование всего result на каждом шаге создало бы лишнюю квадратичную работу.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее