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() вызывается для массива и возвращает одно значение. Это может быть использовано для различных вариантов использования:
- Сумма значений
- Группировка объекта
- Очистка массива
- и т. д.
Если вам нравится этот пост, пожалуйста, аплодируйте, комментируйте и подпишитесь.
Спасибо, что прочитали.