web-dev-qa-db-ja.com

JavaScriptのreduceは、オブジェクトの配列でオブジェクトを返します

オブジェクトの配列があります。たとえば、_[{x:2, y:3}, {x:5, y:4}]_で、その上でreduce((c, n) => c.y + n.y);を呼び出します。明らかに_7_を返します。

ただし、配列に単一のオブジェクトが含まれている場合、たとえば_[{x:2, y:4}]_とすると、同じreduce呼び出しでオブジェクト自体が_{x:2, y:4}_になります。

これは正常な動作ですか?結果が数値ではなくオブジェクトであるかどうかを後で確認する必要がありますか?

5
Jo Colina

はい、これは reduce の通常の動作です。アキュムレータの初期値を渡さない場合(これは常にすべきです)。 2つのオブジェクトを持つ配列以外の配列では、コードが期待どおりに機能しません。

をやる

arr.reduce((acc, el) => acc + el.y, 0)
14
Bergi

これは、初期値(reduceの2番目の引数)を指定しない場合の動作を意図しています。 From [〜#〜] mdn [〜#〜]

配列が空で、initialValueが指定されていない場合、TypeErrorがスローされます。配列に要素が1つだけあり(位置に関係なく)、initialValueが指定されていない場合、またはinitialValueが指定されているが配列が空の場合、ソロ値が返されます呼び出しなしcallback

次のアドバイスが付属しています。

initialValueなしで3つの可能な出力があるため、通常は初期値を指定する方が安全です。

だから書く:

reduce((c, n) => c.y + n.y, { y: 0 });
4
trincot

アキュムレータを{ y : 0}に初期化しましたか

そうしなかった場合は、元のオブジェクトが返されます。

let sum = data.reduce((c, n) => {
  return { "y" : c.y + n.y };
}, { y : 0 });
2
Sushanth --

これは、redux関数がもう1つの引数(デフォルト値)を取ることができ、指定されていない場合は配列の最初の値を取るためです。それが複数で機能する理由です。

しかし、あなたがこのようにそれをするならば

let a = [{x:5, y:4}].reduce((c, n) => c + n.y, 0);

console.log(a)

それは適切に合計されます。

2
Maciej Kozieja

注:initialValueが指定されていない場合、reduceは、最初のインデックスをスキップして、インデックス1からコールバック関数を実行します。 initialValueが指定されている場合、インデックス0から始まります。

配列が空で、initialValueが指定されていない場合、TypeErrorがスローされます。配列に要素が1つだけあり(位置に関係なく)、initialValueが指定されていない場合、またはinitialValueが指定されているが配列が空の場合、コールバックを呼び出さずにソロ値が返されます。

次の例に示すように、initialValueなしで3つの可能な出力があるため、通常は初期値を指定する方が安全です。

1
DarkArtistry