"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}, {:a=>"2017-0-6ren">
gpt4 book ai didi

数组的 Ruby 多个 group_by

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:58 24 4
gpt4 key购买 nike

我有一个这样的数组:

[{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}, {:a=>"2017-01-02", :b=>"5", :c=>"1"}]

例如,如果我用键“: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"}]}

现在我想为每个“:a”分组键“:b”,如:

 => {"2017-01-01"=>["2" => [{:a => "2017-01-01", :b => "2", :c => "1" }], ... }

我该怎么办?提前致谢。

编辑:

多个group by ... 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

最佳答案

快速回答,使用上面的代码:

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

这给出了期望的结果:

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"}
]
}
}

如果您使用 Rails v4.2+ project,这种将散列映射到数组列表,然后将其转换回散列(使用 to_h)的稍微奇怪的模式可以稍微简化, 通过使用 Hash#transform_values :

p.transform_values {|list| list.group_by {|g| g[:b]}}

然而话虽如此,像这样操作复杂的嵌套哈希对象通常被认为是不好的做法。如果您的代码变得过于复杂,您可能希望考虑以更加面向对象的方式重新设计它的工作方式。

关于数组的 Ruby 多个 group_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42135977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com