ホームページ  >  記事  >  ウェブフロントエンド  >  配列内のオブジェクトを複数のプロパティごとに効率的にグループ化し、それらの値を要約するにはどうすればよいでしょうか?

配列内のオブジェクトを複数のプロパティごとに効率的にグループ化し、それらの値を要約するにはどうすればよいでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-08 15:53:02224ブラウズ

How to efficiently group objects in an array by multiple properties and summarize their values?

配列内の複数のプロパティによる効率的なオブジェクトのグループ化

配列内のオブジェクトをグループ化するタスクは、単一のプロパティを超えて拡張される場合があります。場合によっては、グループ化のために複数のプロパティを考慮する必要があります。このシナリオでは、カスタマイズされたアプローチが必要です。

形状と色に基づいてオブジェクトをグループ化する問題に取り組んでみましょう。目的は、同じ形状と色のオブジェクトをグループ化し、それらの使用値とインスタンス値を合計することです。

期待される動作:

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 expectedResult = [
  { 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 }
];

重要な考慮事項:

  • 形状と形状の一意の組み合わせを特定します。カラープロパティ。
  • 同一の組み合わせを持つオブジェクトの使用値とインスタンス値を要約します。

解決策:

Array#reduce を利用して、形状と色を追跡するヘルパー オブジェクトを維持しながら、配列を反復処理できます。

オブジェクトごとに:

  • 形状と色のプロパティに基づいて一意のキーを構築します。
  • キーがヘルパー オブジェクト:

    • 現在のオブジェクトのコピーとして新しいオブジェクトを作成します
    • ヘルパー オブジェクトに追加します。
    • 結果の配列に含めます。
  • キーがすでにヘルパー オブジェクト:

    • ヘルパー内の既存のオブジェクトの使用値とインスタンス値を増分します。 object.

このプロセスは、値を蓄積しながら、同じ形状と色のオブジェクトを効果的にグループ化します。

コード スニペット:

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 }
];

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

  if (!helper[key]) {
    helper[key] = Object.assign({}, o);
    r.push(helper[key]);
  } else {
    helper[key].used += o.used;
    helper[key].instances += o.instances;
  }

  return r;
}, []);

console.log(result);

出力は一貫して正しく、期待されたものと一致します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 }
]

この手法を利用すると、複数のプロパティに基づいて値を効率的にグループ化して合計することができ、配列内の複雑なデータ操作タスクを処理できるようになります。

以上が配列内のオブジェクトを複数のプロパティごとに効率的にグループ化し、それらの値を要約するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。