редуктор выполняется для каждого элемента массива, но «каждый элемент массива» является только ОДНЫМ параметром, почему я могу предположить, что SUM является другим параметром и кэшируется где-то в ожидании следующей операции добавления?
Предоставленный обратный вызов вызывается несколько раз, по одному разу для каждого элемента в массиве (или для length - 1
раз, если начальное значение не указано).Вы можете легко реализовать это самостоятельно:
const array1 = [1, 2, 3, 4];
const reducer = (y, x) => y + x;
Array.prototype.myReduce = function(callback, initialValue) {
let accum = initialValue === undefined
? this.shift()
: initialValue;
for (let i = 0; i < this.length; i++) {
accum = callback(accum, this[i], i, this);
}
return accum;
}
// 1 + 2 + 3 + 4
console.log(array1.myReduce(reducer));
// expected output: 10
// 5 + 1 + 2 + 3 + 4
console.log(array1.myReduce(reducer, 5));
Только то, что вы передаете одну функцию в .reduce
(или в любую другую функцию), не накладывает ограничения на то, сколько раз эта функцияможно вызвать.
и почему я могу предположить, что при уменьшении возвращается сумма в конце?
Так определен метод - как в приведенной выше реализации,аккумулятор (или accum
) переназначается для каждой итерации и передается следующему вызову обратного вызова.
Собственная реализация метода в браузере на самом деле не написана на Javascript, как описано выше, но его функциональностьто же самое (по большей части).
pipeline
работает так же.Для каждого предоставленного элемента массива аккумулятор переназначается, и следующий элемент вызывается с новым аккумулятором.Здесь есть массив вызываемых функций, и возвращаемое значение каждой функции используется в качестве следующего аккумулятора, а значение, возвращаемое последним вызовом функции, - это то, к чему разрешается весь вызов .reduce
.
const pipeline = [
array => { array.pop(); return array; },
array => array.reverse()
];
pipeline.reduce((xs, f) => f(xs), [1, 2, 3]);
Элемент 1: начальное значение (аккумулятор) - [1, 2, 3].Подключившись к array => { array.pop(); return array; }
, вы .pop()
получите его последнее значение (3, в результате чего [1, 2]
, затем вы вернете массив.
Элемент 2: Накопитель (возвращаемое значение последней итерации) равен [1, 2]
Подключите его к array => array.reverse()
, и вы получите тот же массив, в обратном порядке: [2, 1]
.
В массиве больше нет элементов, поэтому это [2, 1]
- это значение, которое в целом reduce
Вызов оценивается в.