我有这样一个数组:
[{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}, {:a=>"2017-01-02", :b=>"5", :c=>"1"}]
Run Code Online (Sandbox Code Playgroud)
例如,如果我使用键":a"对数组进行分组,则结果为:
p = y.group_by { |g| g[:a]}
=> {"2017-01-01"=>[{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}], "2017-01-02"=>[{:a=>"2017-01-02", :b=>"5", :c=>"1"}]}
Run Code Online (Sandbox Code Playgroud)
现在我想分组为每个":a"键":b"如:
=> {"2017-01-01"=>["2" => [{:a => "2017-01-01", :b => "2", :c => "1" }], ... }
Run Code Online (Sandbox Code Playgroud)
我能怎么做?提前致谢.
编辑:
多组由... 1°group_by a,2°group_by b结果为1°等.
y.group_by {|g| g[:a]}.map do |k,v|
[
k, v.group_by { |d| d[:b] }.map do |p,q|
[p, q.group_by { |f| f[:c] }]
end.to_h
]
end.to_h
Run Code Online (Sandbox Code Playgroud)
快速回答,使用上面的代码:
y = [{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}, {:a=>"2017-01-02", :b=>"5", :c=>"1"}]
p = y.group_by { |g| g[:a]}
q = p.map {|date, list| [date, list.group_by {|g| g[:b]}]}.to_h
Run Code Online (Sandbox Code Playgroud)
这给出了以下期望的结果:
q == {
"2017-01-01" => {
"2"=> [
{:a=>"2017-01-01", :b=>"2", :c=>"1"},
{:a=>"2017-01-01", :b=>"2", :c=>"2"}
]
},
"2017-01-02" => {
"5"=> [
{:a=>"2017-01-02", :b=>"5", :c=>"1"}
]
}
}
Run Code Online (Sandbox Code Playgroud)
to_h如果您正在使用Rails v4.2 +项目,通过使用以下内容,可以稍微简化将哈希映射到数组列表,然后将其转换回哈希(使用)的略微奇怪的模式Hash#transform_values:
p.transform_values {|list| list.group_by {|g| g[:b]}}
Run Code Online (Sandbox Code Playgroud)
然而,尽管如此,通常认为操作复杂的嵌套哈希对象是不好的做法.如果您的代码过于复杂,您可能希望以更面向对象的方式考虑重新设计它的工作方式.
| 归档时间: |
|
| 查看次数: |
1258 次 |
| 最近记录: |