Rails在哈希数组中求和值

时间:2017-03-29 07:40:40

标签: ruby-on-rails ruby

以下是一系列哈希:

array = [
  {loading: 10, avg: 15, total: 25 },
  {loading: 20, avg: 20, total: 40 },
  {loading: 30, avg: 25, total: 55 }
]

我需要对每个散列的值求和,结果应该是相同键的散列:

{loading: 60, avg: 60, total: 120}

一种方法是为每个键单独求和值,然后合并为这样的哈希:

loading = array.map { |h| h[:loading] }.sum
avg = array.map { |h| h[:avg] }.sum
total = array.map { |h| h[:total] }.sum

{loading: loading, avg: avg, total: total}

有更好的方法吗?因为密钥可能在将来增加。

1 个答案:

答案 0 :(得分:6)

您可以将each_with_object与哈希值和默认值一起使用:

array = [
  {loading: 10, avg: 15, total: 25 },
  {loading: 20, avg: 20, total: 40 },
  {loading: 30, avg: 25, total: 55 }
]

sum = Hash.new(0)

array.each_with_object(sum) do |hash, sum|
  hash.each { |key, value| sum[key] += value }
end
 # => {:loading=>60, :avg=>60, :total=>120}

它可以使用任意数量的键,如果所有哈希值中都没有键,则不会抱怨。

顺便说一下,你可以替换

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

array.sum { |h| h[:loading] }