1. ホーム
  2. ジャバスクリプト

[解決済み】オブジェクトの配列のプロパティを合計するためにreduceを呼び出す方法は?

2022-03-28 18:18:37

質問

合計したい a.x の各要素に対して arr .

arr = [ { x: 1 }, { x: 2 }, { x: 4 } ];
arr.reduce(function(a, b){ return a.x + b.x; }); // => NaN

私は、以下のように考えています。 a.xundefined を、ある時点で

以下は正常に動作します。

arr = [ 1, 2, 4 ];
arr.reduce(function(a, b){ return a + b; }); // => 7

最初の例では、何が間違っているのでしょうか?

解決方法は?

最初の反復の後、あなたは数値を返し、次にプロパティ x である次のオブジェクトに追加するために、このオブジェクトの undefined を含む数学 undefined の結果は NaN .

を含むオブジェクトを返してみてください。 x プロパティに、パラメータの x プロパティの合計を指定します。

var arr = [{x:1},{x:2},{x:4}];

arr.reduce(function (a, b) {
  return {x: a.x + b.x}; // returns object with property x
})

// ES6
arr.reduce((a, b) => ({x: a.x + b.x}));

// -> {x: 7}

コメントより解説を追加しました。

の各反復の戻り値は [].reduce として使用されます。 a を次の反復で使用します。

イテレーション1 a = {x:1} , b = {x:2} , {x: 3} に割り当てられました。 a 繰り返し2回目

イテレーション2 a = {x:3} , b = {x:4} .

この例の問題点は、数値リテラルを返していることです。

function (a, b) {
  return a.x + b.x; // returns number literal
}

イテレーション1 a = {x:1} , b = {x:2} , // returns 3 として a 次の繰り返しで

イテレーション2 a = 3 , b = {x:2} リターン NaN

数値リテラル 3 というプロパティは(通常は)持っていません。 x であるため undefinedundefined + b.x を返します。 NaNNaN + <anything> は常に NaN

明確化 : 私はこのスレッドの他のトップアンサーよりも私の方法が好きです。なぜなら、マジックナンバーで還元するためにオプションのパラメータを渡して、数プリミティブを取り出す方がきれいだという考えに反対だからです。その結果、書く行数は減るかもしれませんが、読みやすさでは劣ると思います。