Сохраните сигнатуру callback и thisArg, используйте this как исходную коллекцию и записывайте результаты по индексам. Не вызывайте callback для отсутствующих элементов.
Создание собственной версии функции map
Сохраните сигнатуру callback и thisArg, используйте this как исходную коллекцию и записывайте результаты по индексам. Не вызывайте callback для отсутствующих элементов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработать собственную реализацию метода map, reproducing its behavior without использования встроенной функции. При этом необходимо сохранить оригинальную сигнатуру и обеспечить работу с массивами/коллекциями аналогично стандартному map.
(Кодовые фрагменты оставьте без изменений; при необходимости можно переименовать переменные.)
Ответ
Сохраните сигнатуру callback и thisArg, используйте this как исходную коллекцию и записывайте результаты по индексам. Не вызывайте callback для отсутствующих элементов.
function myMap(callback, thisArg) {
'use strict';
if (this == null || typeof callback !== 'function') throw new TypeError('Invalid arguments');
const source = Object(this);
const numericLength = Number(source.length);
const length = Number.isNaN(numericLength) ? 0 :
Math.min(Math.max(Math.trunc(numericLength), 0), Number.MAX_SAFE_INTEGER);
const result = new Array(length);
for (let index = 0; index < length; index++) {
if (index in source) result[index] = callback.call(thisArg, source[index], index, source);
}
return result;
}
myMap.call([1, 2], value => value * 2); // [2, 4]
Поддерживаются обычные массивы и array-like с разумной длиной. Set не имеет индексной структуры и сначала требует преобразования. Это учебная версия без Symbol.species и полного воспроизведения всех крайних случаев спецификации.