group_by在ruby中多次

Mik*_*ord 3 ruby group-by

我有一系列哈希称为events:

events = [
  {:name => "Event 1", :date => "2019-02-21 08:00:00", :area => "South", :micro_area => "A"},
  {:name => "Event 2", :date => "2019-02-21 08:00:00", :area => "South", :micro_area => "A"},
  {:name => "Event 3", :date => "2019-02-21 08:00:00", :area => "South", :micro_area => "B"},
  {:name => "Event 4", :date => "2019-02-21 08:00:00", :area => "South", :micro_area => "B"},
  {:name => "Event 5", :date => "2019-02-21 08:00:00", :area => "North", :micro_area => "A"},
  {:name => "Event 6", :date => "2019-02-21 08:00:00", :area => "North", :micro_area => "A"},
  {:name => "Event 7", :date => "2019-02-21 08:00:00", :area => "North", :micro_area => "B"},
  {:name => "Event 8", :date => "2019-02-21 08:00:00", :area => "North", :micro_area => "B"}
]
Run Code Online (Sandbox Code Playgroud)

我想知道如何group_bydate,然后areamicro_area与哈希例如单个阵列结束:

[
  {
    "2019-02-21 08:00:00": {
      "South": {
        "A": [
          {:name=>"Event 1", :date=>"2019-02-21 08:00:00", :area=>"South", :micro_area=>"A" },
          {:name=>"Event 2", :date=>"2019-02-21 08:00:00", :area=>"South", :micro_area=>"A" }
        ],
        "B": [
          {:name=>"Event 3", :date=>"2019-02-21 08:00:00", :area=>"South", :micro_area=>"B" },
          {:name=>"Event 4", :date=>"2019-02-21 08:00:00", :area=>"South", :micro_area=>"B" }
        ]  
      },
      "North": {
        "A": [
          {:name=>"Event 5", :date=>"2019-02-21 08:00:00", :area=>"North", :micro_area=>"A" },
          {:name=>"Event 6", :date=>"2019-02-21 08:00:00", :area=>"North", :micro_area=>"A" }
        ],
        "B": [
          {:name=>"Event 7", :date=>"2019-02-21 08:00:00", :area=>"North", :micro_area=>"B" },
          {:name=>"Event 8", :date=>"2019-02-21 08:00:00", :area=>"North", :micro_area=>"B" }
        ]  
      }
    }
  }
] 
Run Code Online (Sandbox Code Playgroud)

尝试events.group_by { |r| [r[:date], r[:area], r[:micro_area]] }似乎并不像我想要的那样工作.

ray*_*ray 7

我认为以下将对你有用,

events = [
  { name: 'Event 1', date: '2019-02-21 08:00:00', area: 'South', micro_area: 'A' }
]

events.group_by { |x| x[:date] }.transform_values do |v1|
  v1.group_by { |y| y[:area] }.transform_values do |v2|
    v2.group_by { |z| z[:micro_area] }
  end
end
# {
#   "2019-02-21 08:00:00"=>{
#     "South"=>{
#       "A"=>[
#         {:name=>"Event 1", :date=>"2019-02-21 08:00:00", :area=>"South", :micro_area=>"A"}
#       ]
#     }
#   }
# }   
Run Code Online (Sandbox Code Playgroud)

  • 我已经重新格式化了代码,希望你不要介意. (2认同)

Ste*_*fan 5

另一种选择是在遍历哈希时构建嵌套结构:

events.each_with_object({}) do |event, result|
  d, a, m = event.values_at(:date, :area, :micro_area)
  result[d] ||= {}
  result[d][a] ||= {}
  result[d][a][m] ||= []
  result[d][a][m] << event
end
Run Code Online (Sandbox Code Playgroud)

  • 如果你经常需要这个功能,你可以考虑猴子补丁*Enumerable*。https://gist.github.com/3limin4t0r/b6a7a0b7a5872a74f1cc4e917e5af53d (2认同)