a.x
の各要素を合計したいとしますarr
。
arr = [ { x: 1 }, { x: 2 }, { x: 4 } ];
arr.reduce(function(a, b){ return a.x + b.x; }); // => NaN
いつかそうa.x
なるだろうと信じる理由が私にはある。undefined
以下は問題なく動作します
arr = [ 1, 2, 4 ];
arr.reduce(function(a, b){ return a + b; }); // => 7
最初の例では何が間違っているのでしょうか?
ベストアンサー1
これを実現するよりクリーンな方法は、 の 2 番目の引数として初期値を指定することですreduce
。
var arr = [{x:1}, {x:2}, {x:4}];
var result = arr.reduce(function (acc, obj) { return acc + obj.x; }, 0);
console.log(result); // 7
匿名関数が最初に呼び出されるときは、 で呼び出され(0, {x: 1})
、 を返します0 + 1 = 1
。次に、 で呼び出され(1, {x: 2})
、 を返します1 + 2 = 3
。その後、 で呼び出され(3, {x: 4})
、最終的に を返します7
。
これは配列が空の場合も処理し、 を返します0
。