arrays - 如果它们具有相同的值,则将哈希数组中的值相加

标签 arrays ruby hash

我在这篇文章中看到了这段代码,因为我试图根据某些条件对哈希数组中的值求和。

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/

相关文章:

ruby - 是否有 Ruby 文档可以验证 Enumerable.to_a 在内部调用 each ?

ruby-on-rails - 尝试安装 rubber gem,Nokogiri 把它搞砸了?

ruby-on-rails - 在 Rails Controller 中,在 'map.do' 循环中创建新索引失败,但在 Ruby 中没问题

docker - Docker 镜像的镜像 ID 和摘要有什么区别?

c# - 在 C# 中获取字符串的 16 位哈希值

c# - 数千个相似加密货币条目列表的编辑距离

c# - Array.ToString() 返回 System.Char[] c#

php - 我可以检查哈希密码是否等于 laravel 中的特定值吗?

javascript - 如何在javascript中使用内部数组创建json数组并访问它

javascript - 如何在显示之前过滤自动完成中的结果?