Rails在哈希数组中求和值

Ari*_*rif 0 ruby ruby-on-rails

以下是一系列哈希:

array = [
  {loading: 10, avg: 15, total: 25 },
  {loading: 20, avg: 20, total: 40 },
  {loading: 30, avg: 25, total: 55 }
]
Run Code Online (Sandbox Code Playgroud)

我需要对每个哈希值进行求和,结果应该是相同键的哈希值:

{loading: 60, avg: 60, total: 120}
Run Code Online (Sandbox Code Playgroud)

一种方法是为每个键单独求和值,然后合并为一个散列,如下所示:

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}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?因为密钥将来可能会增加.

Eri*_*nil 7

您可以使用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}
Run Code Online (Sandbox Code Playgroud)

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


顺便说一下,你可以更换

array.map { |h| h[:loading] }.sum
Run Code Online (Sandbox Code Playgroud)

array.sum { |h| h[:loading] }
Run Code Online (Sandbox Code Playgroud)