17

ここで小さなplnkrを作成して、達成しようとしていることを示しました。私は大きなデータセットを持っており、個々のタイプを合計して合計を得るのが好きです。

結果を繰り返してオブジェクトハッシュに追加することも考えられますが、アンダースコアを使用してそれを解決するためのよりエレガントな方法を考えています。underscore.jsを使用していますが、mapreduceやその他の機能パラダイムを試したことはありません。これを行う方法については、plnkrを更新してください。

http://plnkr.co/edit/B5HGxhwvWsfvOR97z7TL?p=preview

var data = [ {'type': "A", 'val':2},
  {'type': "B", 'val':3},
  {'type': "A", 'val':1},
  {'type': "C", 'val':5} ];


 _.each(data, function (elm, index) {
   console.log(elm);  
 });

 /*
 Desired output

 out = [ {'type': "A", 'total':3},
  {'type': "B", 'total':3},
  {'type': "C", 'total':5} ];

 */
4

3 に答える 3

32
var data = [ { type: "A", val: 2 },
             { type: "B", val: 3 },
             { type: "A", val: 1 },
             { type: "C", val: 5 } ];

var groups = _(data).groupBy('type');

var out = _(groups).map(function(g, key) {
  return { type: key, 
           val: _(g).reduce(function(m,x) { return m + x.val; }, 0) };
});

デモ

于 2013-01-20T23:31:47.967 に答える
12

@GregL とほぼ同じ回答ですが、アンダースコアが少し追加されています。

summed_by_type = _(data).reduce(function(mem, d) {
  mem[d.type] = (mem[d.type] || 0) + d.val
  return mem
}, {})

pairs = _(summed_by_type).map(function(v,k) { return {type: k, total: v} })
于 2013-01-20T23:35:15.423 に答える
5

以下は機能しますが、あなたが考えていたものと似ていると思います。利点は、オブジェクト ハッシュを使用して合計を格納することにより、型にインデックスを付けていることです。つまり、正しい型のオブジェクトを見つけようとするたびにハッシュを反復処理する必要がありません。次に、最後に 1 回繰り返して、最終的な出力配列を構築します。

Plunkr はこちらです。

コードは次のとおりです。

var data = [ {'type': "A", 'val':2},
  {'type': "B", 'val':3},
  {'type': "A", 'val':1},
  {'type': "C", 'val':5} ];

var totalPerType = {};
for (var i = 0, len = data.length; i < len; ++i) {
  totalPerType[data[i].type] = totalPerType[data[i].type] || 0;
  totalPerType[data[i].type] += data[i].val;
}
var out = _.map(totalPerType, function(sum, type) {
  return { 'type': type, 'total': sum };
});

 console.log('out = ', out);

編集:ここで、100万個のアイテム配列(6つの可能なタイプ)でもこれがどれほど高速かを生成する新しいplunkrを作成しまし。コンソール出力からわかるように、少なくとも Chrome Canary では、約 1/3 秒で実行されます。

また、中間ハッシュを使用する方がどれだけ高速かについてjsPerf テストを行ったところ、約 50% 高速に動作することがわかりました。

于 2013-01-20T23:13:30.583 に答える