В reduce накапливайте новый массив и добавляйте элемент только при truthy-результате предиката. Начальное значение аккумулятора — пустой массив.
Имитация метода Array.prototype.filter с использованием reduce
В 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 на каждом шаге создало бы лишнюю квадратичную работу.