[英]Sum of non-primitive array elements with reduce() vs forEach()
我玩過以下代碼,但無法解釋為什么結果不同:
let foo = []; let bar = [...foo, { a: 1 }, { a: 2 }]; let sum = bar.reduce((a, b) => aa + ba, 0); console.log(sum); // prints NaN sum = 0; bar.forEach((element) => { sum += element.a; }); console.log(sum); // prints 3
您的問題是a
in (a, b) =>
是reduce
的累加器,它從0
開始(第二個參數)。 這意味着它a
屬性,因此所有后續總和最終都為NaN
,因為您將數字添加到undefined
(以及隨后的NaN
)。 要解決此問題,只需刪除對.a
的引用:
let foo = []; let bar = [...foo, { a: 1 }, { a: 2 }]; let sum = bar.reduce((a, b) => a + ba, 0); console.log(sum); // prints 3
問題是reduce()
鏈,您需要返回一個可以是“下a
”的值。 由於您在 integer 上引用aa
,因此它進入了NaN
領域。
let sum = bar.reduce((a, b) => ({ a: a.a + b.a }), { a: 0 });
一種可能更有效的方法是首先對值進行標准化:
let sum = bar.map(a => a.a).reduce((a, b) => a + b, 0);
現在它只是一個簡單的數字數組。
reduce function 的第一個參數是一個累加器。 根據定義
累加器累加回調的返回值。 它是之前在回調的最后一次調用中返回的累積值——或 initialValue,如果提供了它(見下文)。
如果您從aa
更改為a
那么它應該可以工作。
let sum = bar.reduce((a, b) => a + b.a, 0);
您傳遞給減少 function 的初始值為 0 即。 a = 0 並嘗試對返回NaN的undefined + 1進行計算。 您可以執行以下任何操作:
不傳遞初始值:
bar.reduce((a, b) => aa + ba);
通過傳遞初始值,bur這里需要使用map:
bar.map(a => aa).reduce((a, b) => a + b, 0);
不過可以有更多的方法。 你可以在這里獲得更多
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.