3

次の構造でレイアウトされたレコードの配列があります。

[{"some_id" => 2, "some_total => 250}, {"some_id" => 2, "some_total" => 100}, {"some_id" => 3, "some_total" => 50}, {"some_id" => 3, "some_total" => 50}, {"some_id" => 3, "some_total" => 25}, {"some_id" => 1, "some_total" => 10}]

Rubyのgroup_by/inject/sumまたはEnumerableで利用可能なものを使用して、各ハッシュが「some_id」によってキー付けされ、値がそのidのすべての「some_total」の合計であるハッシュの順序付けられた配列を返すようにする最良の方法は何ですか?配列の先頭に合計が最大の ID で並べ替えますか? 結果は次のようになります。

[{"some_id" => 2, "sum" => 350}, {"some_id" => 3, "sum => 125}, {"some_id" => 1, "sum" => 10}]

4

1 に答える 1

5

機能的アプローチ:

hs.group_by { |h| h["some_id"] }.map do |id, hs|
  sum = hs.map { |h| h["some_total"] }.inject(:+) 
  {:some_id => id, :sum => sum}
end.sort_by { |h| -h[:sum] } 

#=> [{:some_id=>2, :sum=>350}, 
#    {:some_id=>3, :sum=>125}, 
#    {:some_id=>1, :sum=>10}]
于 2011-10-31T21:12:36.953 に答える