2015-02-08 66 views
1

我也有类似的问题,这个话题 Ruby on Rails - Hash of Arrays, group by and sum by column nameRuby on Rails的 - 通过阵列,组哈希,并与多列

然而总和,我的问题是,通过和组具有很多列,而不是一个总和。

例如:我的哈希

[ 
    {"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"]

我试图在一个循环内合并一个电话!但是,结果是错误的。 请教我解决这个案子。对不起,我的愚蠢头脑。

+0

为什么'money1'成为'3.00'。我虽然应该是'2.00'和'1.00'。 – falsetru 2015-02-08 09:48:29

+0

@falsetru你是对的!那是我的错误。 – 2015-02-08 09:50:14

+0

@falsetru我有这样的另一个问题在http://stackoverflow.com/questions/28469348/ruby-how-to-retrieve-sum-in-array-group-by-multiple-keys-with-condition-max/你可以看一下吗?再次感谢 – 2015-02-12 11:50:13

回答

1

usnig Enumerable#group_by,您可以迭代由order,order1键组成的散列数组。

然后合并哈希(通过总结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 
} 
+0

工作。但是,结果中没有看到关键的“order1”。 – 2015-02-08 10:15:15

+0

@VuLe,我不明白你的意思:'看不到键'order1'的结果。' – falsetru 2015-02-08 10:17:01

+0

@VuLe,看到这个:https://ideone.com/BQQSVz。我可以在结果输出中看到'order1'。 – falsetru 2015-02-08 10:17:47