「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript で複数のプロパティでオブジェクトをグループ化し、値を集計する方法

JavaScript で複数のプロパティでオブジェクトをグループ化し、値を集計する方法

2024 年 12 月 25 日に公開
ブラウズ:521

How to Group Objects by Multiple Properties and Aggregate Values in JavaScript?

複数のプロパティによるオブジェクトのグループ化と値の集計

複数のプロパティによって配列内のオブジェクトをグループ化するタスクでは、一般的な要件は次のとおりです。これらのプロパティごとにグループ化するだけでなく、特定のオブジェクト プロパティの値を合計することもできます。ただし、すべての重複を 2 次元配列に単純にネストするだけの解決策では不十分です。

問題ステートメント

形状ごとにグループ化する必要があるオブジェクトの配列を考えてみましょう。色。この配列内のオブジェクトは、形状と色の両方が同じである場合にのみ重複とみなされます。重複したオブジェクトの場合は、使用済みの値とインスタンスの値を合計して重複を削除する必要があります。その結果、固有の形状と色のオブジェクトの簡潔なリストが得られます。

ソリューション

]この問題を効果的に解決するには、Array#reduce メソッドと、遭遇した形状と色の組み合わせを追跡するヘルパー オブジェクトを併用します。

const arr = [
  { shape: 'square', color: 'red', used: 1, instances: 1 },
  { shape: 'square', color: 'red', used: 2, instances: 1 },
  { shape: 'circle', color: 'blue', used: 0, instances: 0 },
  { shape: 'square', color: 'blue', used: 4, instances: 4 },
  { shape: 'circle', color: 'red', used: 1, instances: 1 },
  { shape: 'circle', color: 'red', used: 1, instances: 0 },
  { shape: 'square', color: 'blue', used: 4, instances: 5 },
  { shape: 'square', color: 'red', used: 2, instances: 1 },
];

const helper = {};
const result = arr.reduce((r, o) => {
  const key = `${o.shape}-${o.color}`;

  if (!helper[key]) {
    // If it's a unique combination, add to the helper and result array
    helper[key] = Object.assign({}, o);
    r.push(helper[key]);
  } else {
    // If it's a duplicate, update the values in the helper
    helper[key].used  = o.used;
    helper[key].instances  = o.instances;
  }

  return r;
}, []);

console.log(result);

出力:

[
  { shape: "square", color: "red", used: 5, instances: 3 },
  { shape: "circle", color: "red", used: 2, instances: 1 },
  { shape: "square", color: "blue", used: 11, instances: 9 },
  { shape: "circle", color: "blue", used: 0, instances: 0 }
]

このソリューションは、形状と色によってオブジェクトを効率的にグループ化し、重複オブジェクトの使用値とインスタンス値を集計し、残っている重複を削除して、目的の出力を実現します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3