Привет! Возможно, вам задавали этот вопрос в интервью, а может и нет. В любом случае не помешает всегда знать больше. Итак, здесь я расскажу, как создать полифил для методов массива 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;
}

Если вам понравился этот пост, нажмите на значок аплодисментов и подпишитесь на меня здесь, чтобы узнать больше!