В reduce записывайте результат callback по исходному индексу в заранее созданный массив. Так сохраняются длина и пропуски разреженного массива, в отличие от push.
Имитация Array.map с применением Array.reduce
В reduce записывайте результат callback по исходному индексу в заранее созданный массив. Так сохраняются длина и пропуски разреженного массива, в отличие от push.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Напишите функцию, которая воспроизводит поведение встроенного метода Array.prototype.map, используя исключительно метод reduce для преобразования элементов массива.
Ответ
В reduce записывайте результат callback по исходному индексу в заранее созданный массив. Так сохраняются длина и пропуски разреженного массива, в отличие от push.
function mapWithReduce(array, callback, thisArg) {
if (typeof callback !== 'function') throw new TypeError('callback must be a function');
return array.reduce((result, value, index, source) => {
result[index] = callback.call(thisArg, value, index, source);
return result;
}, new Array(array.length));
}
reduce пропускает отсутствующие элементы, как и map. Callback получает значение, индекс и исходный массив; новый массив не заполняет holes значениями undefined. Это реализация для обычных массивов, а не полный полифил поведения подклассов и Symbol.species.