オブジェクトの配列をグループ化する最も効率的な方法 質問する

オブジェクトの配列をグループ化する最も効率的な方法 質問する

配列内のオブジェクトをグループ化する最も効率的な方法は何ですか?

たとえば、次のオブジェクトの配列があるとします。

[ 
    { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" },
    { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" },
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" },
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" }
]

この情報をテーブルに表示しています。さまざまな方法でグループ化したいのですが、値を合計したいのです。

私は、groupby 関数のために Underscore.js を使用していますが、これは便利ですが、SQL メソッドのように、データを「分割」するのではなく「結合」したいので、これですべてできるわけではありませんgroup by

私が探しているのは、特定の値を合計できることです(要求された場合)。

したがって、 groupby を実行した場合Phase、次のものを受け取ります。

[
    { Phase: "Phase 1", Value: 50 },
    { Phase: "Phase 2", Value: 130 }
]

そして、 groupy Phase/を実行するとStep、次の結果が返されます。

[
    { Phase: "Phase 1", Step: "Step 1", Value: 15 },
    { Phase: "Phase 1", Step: "Step 2", Value: 35 },
    { Phase: "Phase 2", Step: "Step 1", Value: 55 },
    { Phase: "Phase 2", Step: "Step 2", Value: 75 }
]

これに役立つスクリプトはありますか、それとも Underscore.js を使い、結果のオブジェクトをループして自分で合計を計算するほうがよいでしょうか?

ベストアンサー1

外部ライブラリを避けたい場合は、groupBy()次のように簡潔にバニラバージョンを実装できます。

var groupBy = function(xs, key) {
  return xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
    return rv;
  }, {});
};

console.log(groupBy(['one', 'two', 'three'], 'length'));

// => {"3": ["one", "two"], "5": ["three"]}

おすすめ記事