我在这篇文章中看到了这段代码,因为我试图根据某些条件对哈希数组中的值求和。
Rails sum values in an array of hashes
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}
我想做的是,如果 loading 和 avg 在此数组中多次出现相同的值,则对 total key 求和,但我不知道该怎么做。例如。
array = [
{loading: 10, avg: 15, total: 25 },
{loading: 20, avg: 20, total: 40 }, # See here
{loading: 30, avg: 25, total: 55 },
{loading: 20, avg: 20, total: 80 }, # See here
{loading: 10, avg: 20, total: 46 }
]
结果是:
[
{loading: 10, avg: 15, total: 25 },
{loading: 20, avg: 20, total: 120 }, # Results in this
{loading: 30, avg: 25, total: 55 },
{loading: 10, avg: 20, total: 46 }
]
我试图修改这一行
hash.each { |key, value| sum[key] += value }
添加一个条件检查值是否重复但我没有成功。
我们欢迎任何帮助、想法或任何事情。
最佳答案
这似乎可行
array.group_by { |item| [item[:loading], item[:avg]] }.values.flat_map { |items| items.first.merge(total: items.sum { |h| h[:total] }) }
=> [{:loading=>10, :avg=>15, :total=>25}, {:loading=>20, :avg=>20, :total=>120}, {:loading=>30, :avg=>25, :total=>55}, {:loading=>10, :avg=>20, :total=>46}]
关于arrays - 如果它们具有相同的值,则将哈希数组中的值相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43876712/