以下是一系列哈希:
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}
有更好的方法吗?因为密钥可能在将来增加。
答案 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] }