ruby - 如何总结所有哈希值?

标签 ruby algorithm ruby-on-rails-4 hash

<分区>

如何比我更优雅地从所有哈希中求和值? boards_statistics 数组包含 items_info 哈希。

def generate_accumulated_statistics(boards_statistics)
  # Create hash with zero values - its purprose is to
  # accumulate results from all other hashes
  resulted_hash = {
    items_info: {
      finished_items: {
        todo: 0,
        in_progress: 0,
        done: 0
      },

      hours_worked: {
        estimated: 0,
        time_logged: 0
      },

      story_points_completed: {
        estimated: 0,
        completed: 0
      },

      due_today_items: 0,
      late_items: 0
    },
    team_info: []
  }

  boards_statistics.each do |statistics|
    resulted_hash[:items_info][:finished_items][:todo] += statistics[:items_info][:finished_items][:todo]
    resulted_hash[:items_info][:finished_items][:in_progress] += statistics[:items_info][:finished_items][:in_progress]
    resulted_hash[:items_info][:finished_items][:done] += statistics[:items_info][:finished_items][:done]

    resulted_hash[:items_info][:hours_worked][:estimated] += statistics[:items_info][:hours_worked][:estimated]
    resulted_hash[:items_info][:hours_worked][:time_logged] += statistics[:items_info][:hours_worked][:time_logged]

    resulted_hash[:items_info][:story_points_completed][:estimated] += statistics[:items_info][:story_points_completed][:estimated]
    resulted_hash[:items_info][:story_points_completed][:completed] += statistics[:items_info][:story_points_completed][:completed]

    resulted_hash[:items_info][:due_today_items] += statistics[:items_info][:due_today_items]
    resulted_hash[:items_info][:late_items] += statistics[:items_info][:late_items]
  end
end

最佳答案

您可以实现自己的深度合并风格。这里:

class ::Hash
  def deep_merge(second)
    merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : (v1+v2) }
    self.merge(second, &merger)
  end
end

resulted_hash
# => {:items_info=>{:finished_items=>{:todo=>0, :in_progress=>0, :done=>0}, :hours_worked=>{:estimated=>0, :time_logged=>0}, :story_points_completed=>{:estimated=>0, :completed=>0}, :due_today_items=>0, :late_items=>0}, :team_info=>[]}

boards_statistics
#  => {:items_info=>{:finished_items=>{:todo=>1, :in_progress=>1, :done=>1}, :hours_worked=>{:estimated=>1, :time_logged=>1}, :story_points_completed=>{:estimated=>1, :completed=>1}, :due_today_items=>1, :late_items=>1}, :team_info=>[]}

resulted_hash = resulted_hash.deep_merge(boards_statistics)
# => {:items_info=>{:finished_items=>{:todo=>1, :in_progress=>1, :done=>1}, :hours_worked=>{:estimated=>1, :time_logged=>1}, :story_points_completed=>{:estimated=>1, :completed=>1}, :due_today_items=>1, :late_items=>1}, :team_info=>[]}

resulted_hash = resulted_hash.deep_merge(boards_statistics)
# => {:items_info=>{:finished_items=>{:todo=>2, :in_progress=>2, :done=>2}, :hours_worked=>{:estimated=>2, :time_logged=>2}, :story_points_completed=>{:estimated=>2, :completed=>2}, :due_today_items=>2, :late_items=>2}, :team_info=>[]}

关于ruby - 如何总结所有哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32505126/

相关文章:

ruby - MongoDB 驱动程序 ruby​​,删除文档中的字段

c# - key.contains(x) Map/Dictionary 的适当数据结构

c - 可中断就地排序算法

ruby-on-rails - 如何设置标签的最小和最大数量?

ruby-on-rails - Rails 4 相当于 Rails 3 'Model.all'

ruby-on-rails - RSpec redirect_to 和 return 与 redirect_to && return

arrays - 使用递归重写 Ruby #inject (#reduce)?

ruby - 正则表达式在 Ruby 中捕获相同数字的组

c++ - 将 n 个对象分成 m 个集合的最简单方法,其中 m 不除 n?

ruby - 在 Rails 中,为什么我的 Controller 参数被类修改