簡體   English   中英

使用 reduce() 與 forEach() 的非原始數組元素的總和

[英]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 並嘗試對返回NaNundefined + 1進行計算。 您可以執行以下任何操作:

  1. 不傳遞初始值:

    bar.reduce((a, b) => aa + ba);

  2. 通過傳遞初始值,bur這里需要使用map:

    bar.map(a => aa).reduce((a, b) => a + b, 0);

不過可以有更多的方法。 你可以在這里獲得更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM