javascript - Javascript 中的归约函数

标签 javascript functional-programming abstraction higher-order-functions

我正在使用 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。它不比较 0add(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/

相关文章:

javascript - Polymer 2 - 单击另一个元素时显示一个元素

javascript - 在 Bootstrap 中以模态加载轮播中的特定幻灯片

.net - F# 和鸭式打字

F#:如何求笛卡尔幂

c++ - 避免虚拟模板

javascript - 使用 getUserMedia() 同时从多个麦克风录制音频

javascript - 如何通过 jQuery 滑动切换下拉菜单项?

types - 变体还是多态变体?

java - 在 Java 中寻找 "consumer that returns value"抽象

java - 处理继承时重写 equals 方法