在hash中求和数组的值

这是我的arrays

[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2 , :alt_amount=>30}] 

我想要结果

 [{:amount => 30}] or {:amount = 30} 

任何想法?

您可以使用inject来总和所有金额。 如果需要的话,你可以把结果放回散列表中。

 arr = [{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2, :alt_amount=>30}] amount = arr.inject(0) {|sum, hash| sum + hash[:amount]} #=> 30 {:amount => amount} #=> {:amount => 30} 

array.map { |h| h[:amount] }.sum

Ruby 2.4.0有一个Enumerable#sum方法。 所以你可以做

 arr.sum {|h| h[:amount] } 

这是做到这一点的一种方法:

 a = {amount:10,gl_acct_id:1,alt_amount:20},{amount:20,gl_acct_id:2,alt_amount:30} a.map {|h| h[:amount] }.reduce(:+) 

不过,我觉得你的对象模型有点欠缺。 有了更好的对象模型,您可能可以执行如下操作:

 a.map(&:amount).reduce(:+) 

甚至只是

 a.sum 

请注意,正如@ sepp2k指出的那样,如果你想出去一个Hash ,你需要把它包装在一个Hash

 [{ :amount=>10, :gl_acct_id=>1, :alt_amount=>20 },{ :amount=>20, :gl_acct_id=>2, :alt_amount=>30 }].sum { |t| t[:amount] } 
 total=0 arr = [{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2, :alt_amount=>30}] arr.each {|x| total=total+x[:amount]} puts total