Ruby on rails Rails哈希数组中的和值

Ruby on rails Rails哈希数组中的和值,ruby-on-rails,ruby,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 { |

以下是哈希数组:

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}
有更好的方法吗?因为密钥将来可能会增加。

您可以使用哈希和默认值:

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 = [
  {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