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)
有没有更好的方法呢?因为密钥将来可能会增加.
您可以使用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)
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |