Привет! Возможно, вам задавали этот вопрос в интервью, а может и нет. В любом случае не помешает всегда знать больше. Итак, здесь я расскажу, как создать полифил для методов массива map, filter и reduce.
Давайте код!
Pollyfill для Array.map ()
Давайте сначала посмотрим, как работает Array.map (), исходя из его синтаксиса:
let newArray = arr.map(callback(currentValue[, index[, array]]) {
// return element for newArray, after executing something
});
Итак, исходная функция Array.map принимает в качестве аргумента функцию обратного вызова, и в эту функцию обратного вызова можно передать три аргумента:
a. текущее значение
b. индекс текущего значения [необязательно]
c. массив [необязательно]
Исходя из этого, давайте создадим нашу собственную функцию карты:
Array.prototype.myMap = function(callbackFn) {
var arr = [];
for (var i = 0; i < this.length; i++) {
/* call the callback function for every value of this array and push the returned value into our resulting array
*/
arr.push(callbackFn(this[i], i, this));
}
return arr;
}
Pollyfill для Array.filter ()
Давайте сначала посмотрим, как работает Array.filter (), исходя из его синтаксиса:
let newArray = arr.filter(callback(currentValue[, index[, array]]) {
// return element for newArray, if true
});
Итак, исходная функция Array.filter принимает в качестве аргумента функцию обратного вызова, и в эту функцию обратного вызова можно передать три аргумента:
a. текущее значение
b. индекс текущего значения [необязательно]
c. массив [необязательно]
Исходя из этого, давайте создадим нашу собственную функцию фильтрации:
Array.prototype.myFilter = function(callbackFn) {
var arr = [];
for (var i = 0; i < this.length; i++) {
if (callbackFn.call(this, this[i], i, this)) {
arr.push(this[i]);
}
}
return arr;
}
Полифилл для Array.reduce ()
Давайте сначала посмотрим, как работает Array.reduce (), исходя из его синтаксиса:
arr.reduce(callback( accumulator, currentValue, [, index[, array]] )[, initialValue])
Итак, исходная функция Array.reduce принимает два аргумента:
1. Функция обратного вызова в качестве аргумента, и в эту функцию обратного вызова можно передать четыре аргумента:
а. аккумулятор
b. текущее значение
c. индекс текущего значения [необязательно]
d. массив [необязательно]
2. начальное значение.
Исходя из этого, давайте создадим нашу собственную функцию уменьшения:
Array.prototype.myReduce= function(callbackFn, initialValue) { var accumulator = initialValue;
for (var i = 0; i < this.length; i++) { if (accumulator !== undefined) { accumulator = callbackFn.call(undefined, accumulator, this[i], i, this); } else { accumulator = this[i]; } } return accumulator; }
Если вам понравился этот пост, нажмите на значок аплодисментов и подпишитесь на меня здесь, чтобы узнать больше!