【发布时间】:2011-04-13 06:47:59
【问题描述】:
这是我的数组
[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2
, :alt_amount=>30}]
我想要结果
[{:amount => 30}] or {:amount = 30}
有什么想法吗?
【问题讨论】:
这是我的数组
[{: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}
【讨论】:
这是一种方法:
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 中。
【讨论】:
Foo = Struct.new(:amount, :gl_acct_id, :alt_amount); a = [Foo.new(10, 1, 20), Foo.new(20,2,30)]; a.map(&:amount).inject(:+) #=> 30
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
【讨论】:
total = arr.inject(0) {|sum, hash| sum += hash[:amount]}
array.map { |h| h[:amount] }.sum
【讨论】:
[{
:amount=>10,
:gl_acct_id=>1,
:alt_amount=>20
},{
:amount=>20,
:gl_acct_id=>2,
:alt_amount=>30
}].sum { |t| t[:amount] }
【讨论】:
Ruby 版本 >= 2.4.0 有一个 Enumerable#sum 方法。所以你可以做
arr.sum {|h| h[:amount] }
【讨论】:
为什么不采摘?
ary = [{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2, :alt_amount=>30}]
ary.pluck(:amount).sum
# for more reliability
ary.pluck(:amount).compact.sum
【讨论】:
如果我们在一个数组的所有哈希中只有一个元素,而且键也不同?
这是我找到的解决方案:
值的总和:
x = [{"a" => 10},{"b" => 20},{"d" => 30}]
解决方案:
x.inject(0){|sum, hash| sum+= hash.values.join.to_i }
我们也可以这样做:
x.inject(0){|sum, hash| sum+= hash.values.sum }
【讨论】: