JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでIDごとにオブジェクトの配列をグループ化する方法

JavaScriptでオブジェクトの配列をidなどの特定のキーごとにグループ化したい場合、reduce()メソッドを使うと簡潔に実装できます。この記事では、どのプロパティにも対応できる汎用的なgroupBy関数を作成し、実際のサンプルコードとともにその仕組みを詳しく解説します。

reduce()によるグループ化の考え方

reduce()は、配列の各要素を順番に処理しながら、1つの累積値(ここではオブジェクト)を組み立てていくメソッドです。各要素からキーの値を取り出し、その値がまだ結果オブジェクトに存在しなければ新しい配列を作成して、そこへ要素を追加していくことでグループ化を実現します。

サンプルコード

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
   body {
      font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
   }
   .result {
      font-size: 18px;
      font-weight: 500;
      color: rebeccapurple;
   }
</style>
</head>
<body>
<h1>JavaScriptでオブジェクトの配列を年齢ごとにグループ化する</h1>
<div class="result">
{ name: 'Rohan', age: 18 }, { name: 'Mohan', age: 20 }, { name: 'Shawn', age: 18 },
{ name: 'Michael', age: 18 }, { name: 'David', age: 20 }
</div>
<button class="Btn">クリック</button>
<h3>上のボタンをクリックすると、オブジェクトが年齢ごとにグループ化されます</h3>
<script>
   let resEle = document.querySelector(".result");
   let sampleEle = document.querySelector(".sample");
   let BtnEle = document.querySelector(".Btn");
   const people = [
      { name: "Rohan", age: 18 },
      { name: "Mohan", age: 20 },
      { name: "Shawn", age: 18 },
      { name: "Michael", age: 18 },
      { name: "David", age: 20 },
   ];
   let groupBy = (array, key) => {
      return array.reduce((result, obj) => {
         (result[obj[key]] = result[obj[key]] || []).push(obj);
         return result;
      }, {});
   };
   let a = groupBy(people, "age");
   BtnEle.addEventListener("click", () => {
      console.log(a);
   });
</script>
</body>
</html>

groupBy関数のポイント解説

この関数の核心は、次の1行です。

(result[obj[key]] = result[obj[key]] || []).push(obj);
  • obj[key]で、現在処理中のオブジェクトからグループ化の基準となる値(この例ではage)を取得します。
  • result[obj[key]] || []により、該当するキーがまだ存在しない場合は空の配列で初期化されます。
  • .push(obj)で、そのオブジェクトを対応するグループの配列に追加します。

この関数は第2引数にキー名を渡す設計になっているため、idなど他のプロパティにもそのまま流用できます。たとえば各オブジェクトがidプロパティを持っていれば、groupBy(items, "id")と書くだけでidごとのグループ化が可能です。

実行結果

上記コードをブラウザで開くと、まず元のデータが画面に表示されます。

JavaScriptでIDごとにオブジェクトの配列をグループ化する方法

「クリック」ボタンを押してコンソールを確認すると、次のように年齢をキーとしてグループ化されたオブジェクトが出力されます。

JavaScriptでIDごとにオブジェクトの配列をグループ化する方法

{
  18: [
    { name: 'Rohan', age: 18 },
    { name: 'Shawn', age: 18 },
    { name: 'Michael', age: 18 }
  ],
  20: [
    { name: 'Mohan', age: 20 },
    { name: 'David', age: 20 }
  ]
}

補足:Object.groupBy()という選択肢

近年のJavaScript環境では、ES2024で標準化されたObject.groupBy()を使うことで、同様の処理をさらに簡潔に記述できます。

const grouped = Object.groupBy(people, (item) => item.age);

対応しているブラウザ・ランタイムが限られる点には注意が必要ですが、モダンな開発環境ではこちらの採用も検討する価値があります。

  1. JavaScriptでオブジェクトを含む「配列の配列」をループ処理する方法

    JavaScriptでオブジェクトを含む多次元配列をループするには?JavaScriptでは、オブジェクトを含む配列の配列(入れ子構造の配列)をループ処理する際、forEach()メソッドをネストして使用し、さらにfor...inループで各オブジェクトのプロパティにアクセスするのが一般的な方法です。以下に、具体的な実装例を紹介します。コード例<!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device

  2. JavaScriptで値に基づいてオブジェクトをグループ化する方法

    JavaScriptでは、reduce()メソッドを活用することで、配列内のオブジェクトを特定の値(プロパティ)に基づいて効率的にグループ化できます。たとえば、複数人のデータを「年齢」ごとにまとめたい場合などに役立ちます。ここでは、実際に動作するサンプルコードをもとに、実装手順と仕組みをわかりやすく解説します。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewpo