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

JavaScriptでdayプロパティの値に基づいてオブジェクトをグループ化する方法

この記事では、JavaScriptにおいて、オブジェクト内の各要素を特定のプロパティ(day)の値ごとにグループ化し、新しいオブジェクトとして分離する方法を解説します。

問題の定義

まず、次のようなオブジェクトがあると仮定しましょう。

const obj = {
    0: { "time": 1, "day": 1 },
    1: { "time": 2, "day": 1 },
    2: { "time": 3, "day": 1 },
    3: { "time": 1, "day": 2 },
    4: { "time": 2, "day": 2 },
    5: { "time": 3, "day": 2 }
};

ここで求められているのは、このようなオブジェクトを受け取り、day キーの値が同じ要素どうしを、それぞれ独立したサブオブジェクトにグループ化するJavaScript関数を作成することです。

期待される出力

上記のオブジェクトの場合、出力は次のようになります。

const output = {
    '1': {
        '1': { time: 1, day: 1 },
        '2': { time: 2, day: 1 },
        '3': { time: 3, day: 1 }
    },
    '2': {
        '1': { time: 1, day: 2 },
        '2': { time: 2, day: 2 },
        '3': { time: 3, day: 2 }
    }
};

実装コード

この処理を実現するコードは以下の通りです。Object.values()reduce() を組み合わせることで、簡潔に記述できます。

const groupObject = obj => {
    let res = {};
    res = Object.values(obj).reduce((acc, val) => {
        if(acc[val['day']] === undefined){
            acc[val['day']] = {};
        };
        acc[val['day']][val['time']] = val;
        return acc;
    }, {});
    return res;
};

console.log(groupObject(obj));

コードのポイント

  • Object.values(obj): 元のオブジェクトから値(各要素)のみを配列として取り出します。
  • reduce(): 各要素を順番に処理しながら、day の値をキーとする新しいオブジェクトを構築します。
  • 初期化チェック: 該当する day のキーがまだ存在しない場合は、空のオブジェクトで初期化してから要素を追加します。
  • ネストしたキー割り当て: acc[val['day']][val['time']] = val; により、day → time という二段階の階層構造で各要素が格納されます。

実行結果

コンソールへの出力は以下のようになります。

{
    '1': {
        '1': { time: 1, day: 1 },
        '2': { time: 2, day: 1 },
        '3': { time: 3, day: 1 }
    },
    '2': {
        '1': { time: 1, day: 2 },
        '2': { time: 2, day: 2 },
        '3': { time: 3, day: 2 }
    }
}

このように、day の値ごとに要素が整理されたオブジェクトが得られます。同じ手法は、任意のキーを基準としたデータのグループ化にも幅広く応用できるので、ぜひ活用してみてください。

  1. JavaScriptでプロパティを共有する方法 ― prototype活用のコード例と解説

    JavaScriptでは、オブジェクトのprototypeプロパティに値を追加することで、プロパティを複数のインスタンス間で共有できます。prototypeに登録されたプロパティは、そのコンストラクタから生成されたすべてのインスタンスから共通して参照されます。 この手法には大きなメリットがあります。各インスタンスごとに同じ値のプロパティを個別に定義する必要がないため、コードの重複を減らし、メモリの使用量も抑えられるのです。たとえば、学校名のように全生徒で共通する情報は、prototypeにまとめておくのが理想的です。 実装例:prototypeでプロパティを共有するコード 以下は、JavaS

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

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