Для чего используется метод 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.