配列内のオブジェクトをグループ化する最も効率的な方法は何ですか?
たとえば、次のオブジェクトの配列があるとします。
[
{ 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"]}