[英]A reduce function in Javascript
我正在使用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
傳遞為reduce
base
。 那不是很奇怪嗎? 假設我嘗試運行sum([1,2,3])
...在它的第一個循環中看起來不是0 = add(0,1)
嗎? 我不明白
加完后,僅將總和作為base
。 因此,它在每個循環中都遞增。
base = combine(base, element)
該語句首先計算combine(base, element)
並將其分配給base
。 它不比較0
和add(0, 1)
。 因此對於下一次迭代, base
將具有所有先前值的總和。
EDITED
假設您調用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。
base是將包含所有元素之和的變量。 通常以0開頭。
不是:0 = add(0,1)
而是:base將包含base和1的先前值的總和
還要記住,等號右側的內容將首先進行評估。 所以,
base = combine(base, element)
正在獲取combine(base, element)
的結果並將其分配給變量base
(現在將覆蓋先前分配給的base
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.