我正在使用 Marijn Haverbeke 的书《Eloquent JavaScript》学习 Javascript,但不明白以下示例:
function reduce(combine, base, array) {
forEach(array, function (element) {
base = combine(base, element);
});
return base;
}
function add(a, b) {
return a + b;
}
function sum(numbers) {
return reduce(add, 0, numbers);
}
forEach
函数是他在本书前面介绍的函数,如下所示:
function forEach(array, action) {
for(var i = 0; i < array.length; i++)
action(array[i]);
}
现在,回到reduce
函数,我不明白的是为什么在sum
函数中,0
被传递为基
到减少
。这不是很奇怪吗?假设我尝试运行 sum([1,2,3])
...它看起来不像 0 = add(0,1)
吗?第一个循环?我不明白。
最佳答案
添加后,仅将总和放入base
。所以它在每个循环中都会增加。
base=combine(base, element)
该语句首先计算combine(base, element)
并将其分配给base
。它不比较 0
和 add(0, 1)
。因此,对于下一次迭代,base
将具有所有先前值的总和。
已编辑
假设您调用reduce(combine, 0, [10, 22, 7, 5])
。循环将迭代为
Iteration base element
1 0 10
计算完add(base, element)
后,base
被设置为10。因此对于下一次迭代,其值为10。
1 10 22
计算完add(base, element)
后,base
被设置为32。因此对于下一次迭代,它的值为32。
1 32 7
计算完add(base, element)
后,base
被设置为39。因此对于下一次迭代,它的值为39。
1 39 5
计算完 add(base, element)
后,base
被设置为 44。由于没有剩余元素,所以答案为 44。
关于javascript - Javascript 中的归约函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12673295/