Для чего используется метод map? Он перебирает массив элементов и возвращает вам новый массив. Простейшим примером будет возведение в квадрат чисел в массиве.

let nums = [1,2,3,4];
let squares = nums.map(val => val * val); // [1,4,9,16]

Теперь, как мне создать пользовательскую функцию карты, чтобы сделать то же самое? Используйте Array.prototype.methodName, чтобы создать метод расширения для массива.

Array.prototype.customMap = function(){
  // your implementation goes here
}

Приведенный выше фрагмент кода создаст метод customMap, связанный с объектами Array.

Теперь, что касается внутренней реализации функции map, она принимает функцию обратного вызова в качестве входных данных и возвращает новый массив.

Array.prototype.customMap = function(callback){
  let newArray = [];
  for (let i = 0 ; i < this.length ; i++){
    newArray.push(callback(this[i]));
  }
  return newArray;
}

В приведенном выше фрагменте кода this относится к текущему объекту Array, переданному функции карты.

Приведенная выше реализация является базовой версией функции карты, но фактический метод карты использует функцию обратного вызова, которая имеет три элемента — currentValue, index и input array.

Таким образом, при добавлении этих параметров к обратному вызову код выглядит примерно так, как показано ниже.

Array.prototype.customMap = function(callback){
  let newArray = [];
  for (let i = 0 ; i < this.length ; i++){
    newArray.push(callback(this[i], i, this));
  }
  return newArray;
}

Общий фрагмент с добавленной проверкой ошибок выглядит примерно так, как показано ниже.

Array.prototype.customMap = function(callback){
  // Validating if this is null
  if (this == null) {
    throw new TypeError('this is null');
  }
  // Validating if callback is a function
  if (typeof callback !== 'function'){
    throw new TypeError(callback + ' is not a function');
  }
  let newArray = [];
  for (let i = 0 ; i < this.length ; i++){
    newArray.push(callback(this[i], i, this));
  }
  return newArray;
}

Это очень простая версия функции карты. Вы можете ознакомиться с полным кодом полифилла здесь на MDN.