Array.prototype.reduce

Понимание метода Array.prototype.reduce() и возможной его реализации.

Метод Array.prototype.reduce() уменьшает массив до одного значения.
Он принимает два параметра: функцию обратного вызова (reducer) и начальное значение.

Функция reducer возвращает значение при циклическом просмотре каждого элемента массива.

Исходное значение указывать необязательно. Если задано, оно становится значением аккумуляторав первой итерации.

Обратный вызов reducer принимает четыре параметра:

  • Накопитель: это значение, возвращаемое предыдущим вызовом reducer. В первой итерации значением аккумулятора является начальное значение. Если начальное значение не задано, значением аккумулятора является первый элемент массива (массив[0]). Окончательное значение аккумулятора становится возвращаемым значением Array.prototype.reduce().
  • Текущее значение: значение текущего элемента. В первой итерации, если указано начальное значение, текущее значение является первым элементом в массиве. (массив[0]), иначе это второй элемент массива (массив[1]).
  • Текущий индекс: индекс текущего значения.
  • Массив: массив, для которого вызывается Array.prototype.reduce().
let nums = [1,4,3,2];
nums.reduce((acc, currentVal, currentInd, arr) => {
    return acc + currentVal;
}, 2);

// returns 12

Из фрагмента кода метод reduce() вызывается для массива nums. Array.prototype.reduce() принимает функцию reducer и начальное значение 2.

В первой итерации накопитель равен начальному значению (2 ), а текущее значение – это массив[0]. Затем редьюсер возвращает 2 + 1, что равно 3. Это возвращаемое значение присваивается аккумулятору.

Во второй итерации накопитель равен 3, а текущее значение равно массиву[1 ]. Затем редуктор возвращает 3 + 4, что равно 7. Это значение присваивается аккумулятору.

В третьей итерации накопитель равен 7, а текущее значение равно массиву[2]. ]. Редуктор возвращает 7 + 3, что равно 10. Это возвращаемое значение присваивается аккумулятору.

В четвертой итерации (последней) аккумулятор равен 10, а текущее значение — массив[3 ]. редуктор возвращает 10 + 2, что равно 12. Это значение присваивается аккумулятору.

Значение аккумулятора(12) становится возвращаемым значением Array.prototype.reduce(). метод.

Есть три особых случая:

  • Если массив пуст и начальное значение не задано, генерируется TypeError.
  • Если массив содержит только один элемент и начальное значение не задано, элемент массива возвращается без вызова редьюсера.
  • Если массив пуст и задано начальное значение, возвращается начальное значение без вызова >редуктор.

Давайте посмотрим, как можно реализовать метод Array.prototype.reduce(), создав собственный метод (gReduce) в объекте Array.prototype.

Array.prototype.gReduce = function(callback, initialVal){
    let context = this;

    if(context.length === 0 && initialVal === undefined){
        throw new TypeError('Reduce of empty array with no initial value');
    }

    if(context.length === 1 && initialVal === undefined){
        return context[0];
    }

    for(let i = 0; i < context.length; i++){
        
        if(initialVal === undefined){
            initialVal = callback(context[i], context[i+1], i+1, context);
            i++;
            continue;
        }else{
            initialVal = callback(initialVal, context[i], i, context);
        }
    }
    return initialVal;
}



[1,2,3,4].gReduce((acc, currentVal, currentIndex, arr) => {
    return acc + currentVal;
}, 2)

// returns 12;

Глядя на реализацию, сначала обрабатывались 3 особых случая.

Если массив пуст и начальное значение не задано, генерируется TypeError.

if(context.length === 0 && initialVal === undefined){
     throw new TypeError('Reduce of empty array with no initial value');
}

Если массив содержит только один элемент и начальное значение не задано, элемент массива возвращается без вызова редьюсера.

if(context.length === 1 && initialVal === undefined){
     return context[0];
}

Если массив пуст и задано начальное значение, начальное значение возвращается без вызова начального значения. >редуктор. Условие в цикле for обрабатывает это, поскольку длина массива не больше нуля.

for(let i = 0; i < context.length; i++)

Заключение

Метод Array.prototype.reduce() — это мощный метод, который можно использовать, но если он не совсем понятен, его следует избегать. Эта статья написана, чтобы четко объяснить, как это работает.

Метод Array.prototype.reduce() вызывается для массива и возвращает одно значение. Это может быть использовано для различных вариантов использования:

  • Сумма значений
  • Группировка объекта
  • Очистка массива
  • и т. д.

Если вам нравится этот пост, пожалуйста, аплодируйте, комментируйте и подпишитесь.

Спасибо, что прочитали.