在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