Ruby 1.8.7: group_by с суммой в перечислимом виде - PullRequest
3 голосов
/ 01 ноября 2011

У меня есть массив записей, который имеет следующую структуру:

[{"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's group_by / inject / sum или все, что доступно в Enumerable, чтобы он возвращал упорядоченный массив хэшей, где каждый хеш имеет ключ "some_id", а значение является суммой всех этих идентификаторов "some_total", упорядоченный по идентификатору с наибольшей суммой в начале массива? Результаты будут выглядеть следующим образом:

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

1 Ответ

5 голосов
/ 01 ноября 2011

Функциональный подход:

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}]
...