Ruby on Rails – Hash of Arrays,group by和sum by many columns

我有一个类似的问题,这个主题Ruby on Rails – Hash of Arrays,group by和sum by column name

但是,我的问题是group by和sum by with many columns而不是one。

例如:我的哈希

[ {"idx"=>"1234", "account"=>"abde", "money"=>"4.00", "money1"=>"1.00", "order"=>"00001", "order1"=>"1"}, {"idx"=>"1235", "account"=>"abde", "money"=>"2.00", "money1"=>"1.00", "order"=>"00001", "order1"=>"1"}, {"idx"=>"1235", "account"=>"abde", "money"=>"3.00", "money1"=>"1.00", "order"=>"00002", "order1"=>"2"} ] 

结果是这样的

 [ {"idx"=>"1234", "account"=>"abde", "money"=>"6.00", "money1"=>"2.00","order"=>"00001", "order1"=>"1"}, {"idx"=>"1234", "account"=>"abde", "money"=>"3.00", "money1"=>"1.00","order"=>"00002", "order1"=>"2"} ] 

像这样的group_hashes arr, ["order","order1"], ["money","money1"]

我在合并中尝试了一个循环! 但结果是错误的。 请教我解决这个案子。 抱歉我的愚蠢思想。

Usnig Enumerable#group_by ,您可以迭代按orderorder1键分组的哈希数组。

然后合并哈希(通过总结moneymoney1条目):

 a = [ {"idx"=>"1234", "account"=>"abde", "money"=>"4.00", "money1"=>"1.00", "order"=>"00001", "order1"=>"1"}, {"idx"=>"1235", "account"=>"abde", "money"=>"2.00", "money1"=>"1.00", "order"=>"00001", "order1"=>"1"}, {"idx"=>"1235", "account"=>"abde", "money"=>"3.00", "money1"=>"1.00", "order"=>"00002", "order1"=>"2"} ] a.group_by { |x| x.values_at('order', 'order1') }.map {|key, hashes| result = hashes[0].clone ['money', 'money1'].each { |key| result[key] = hashes.inject(0) { |s, x| s + x[key].to_f } } result } # => [{"idx"=>"1234", "account"=>"abde", "money"=>6.0, "money1"=>2.0, "order"=>"00001", "order1"=>"1"}, # {"idx"=>"1235", "account"=>"abde", "money"=>3.0, "money1"=>1.0, "order"=>"00002", "order1"=>"2"}] 

 group_keys = ['order', 'order1'] sum_keys = ['money', 'money1'] a.group_by { |x| x.values_at(*group_keys) }.map {|key, hashes| result = hashes[0].clone sum_keys.each { |key| result[key] = hashes.inject(0) { |s, x| s + x[key].to_f } } result }