Полезно думать о функции «уменьшить» в терминах «кратной» функции высшего порядка . Другими словами, ваша функция «Reduce» будет применена к списку значений и к накопленному объекту (переменная «result» в ваших примерах), который изначально указан, но в конечном итоге будет заменен вывод последовательных вызовов вашей функции . Более того, список значений, к которым будет применяться ваша функция, можно разбить на любое количество подсписков в любом порядке!
Например, рассмотрим, как ваша функция будет вести себя, используя JavaScript Array «Reduce» функцию , которая является примером функции «fold» высшего порядка. Ваш первый пример будет работать неправильно, потому что он не использует свойство «Count» каждого элемента. Последующие попытки использовать его с Array # redund также потерпят неудачу:
function badReducer(accum, x) {
accum.Count += 1;
return accum;
}
var sum = {Count:0};
sum = [{Count:1}, {Count:2}, {Count:3}].reduce(badReducer, sum);
sum; // => {Count:3}, d'oh!
sum = [{Count:4}].reduce(badReducer, sum);
sum; // => {Count:5}, d'oh!
Однако ваш второй пример правильно добавляет свойство «Количество» и может последовательно применяться к своему собственному выводу:
function goodReducer(accum, x) {
accum.Count += x.Count;
return accum;
}
var sum = {Count:0};
sum = [{Count:1}, {Count:2}, {Count:3}].reduce(goodReducer, sum);
sum; // => {Count:6}, woohoo!
sum = [{Count:4}].reduce(goodReducer, sum);
sum; // => {Count:10}, woohoo!