Array.prototype.map ()
Метод map () создает новый массив, заполненный результатами вызова предоставленной функции для каждого элемента в вызывающем массиве.
Array.prototype.myMap = function(callback) {
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
}
const obj = Object(this);
let newArr = new Array(this.length);
let i = 0;
while (i < obj.length) {
if (i in obj) {
newArr[i] = callback.call(this, obj[i], i, obj);
}
i++;
}
return newArr;
}
Array.prototype.filter ()
Метод filter () создает новый массив со всеми элементами, которые проходят проверку, реализованную предоставленной функцией.
Array.prototype.myFilter = function(callback) {
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
}
const obj = Object(this);
let newArr = new Array(obj.length);
let i = 0, actualLen = 0;
while (i < obj.length) {
if (i in obj) {
if (callback.call(this, obj[i], i, obj)) {
newArr[actualLen++] = obj[i];
}
}
i++;
}
newArr.length = actualLen;
return newArr;
}
Array.prototype.reduce ()
Метод reduce () выполняет функцию редуктора (которую вы предоставляете) для каждого элемента массива, в результате чего получается одно выходное значение.
Array.prototype.myReduce = function(...args) {
if (typeof args[0] !== 'function') {
throw new TypeError(args[0] + ' is not a function');
}
const obj = Object(this);
let i = 0;
let result;
if (args.length > 1) {
result = args[1];
} else {
result = obj[i++];
}
while (i < obj.length) {
if (i in obj) {
result = args[0].call(this, result, obj[i], i, this);
}
i++;
}
return result;
}
Вышеупомянутые полифиллы предназначены только для целей реализации, полифиллы, представленные в MDN, определенно лучше, и не следует использовать их собственные полифиллы поверх методов API. Спасибо за прочтение :)