Reputation: 195
I have multiple hashes who looks like this:
[{"name" => "name1", "folder" => "folder1", id => 1 },
{"name" => "name1", "folder" => "folder1", id => 2 },
{"name" => "name1", "folder" => "folder2", id => 3},
{"name" => "name2", "folder" => "folder1", id => 4}]
And my goal is to have something who looks like this:
{"name1" =>
[{"folder1" =>
[{"name" => "name1", "folder" => "folder1", id => 1 },
{"name" => "name1", "folder" => "folder1", id => 2 }] }
{"folder2" =>
[{"name" => "name1", "folder" => "folder2", id => 3}] }]
{"name2" =>
[{"folder 1" =>
[{"name" => "name2", "folder" => "folder1", id => 4}] }] }
I didn't find a proper solution who give exactly this kind or a similar result for now.
Edit: i tried that and many others but never found the way of having two level's deep hashes a.group_by{|line| line["name"]}.each_value {|v| v.map{|line| line["folder"]}}
Upvotes: 1
Views: 1748
Reputation: 4440
a = [{"name" => "name1", "folder" => "folder1", 'id' => 1 },
{"name" => "name1", "folder" => "folder1", 'id' => 2 },
{"name" => "name1", "folder" => "folder2", 'id' => 3},
{"name" => "name2", "folder" => "folder1", 'id' => 4}]
a.group_by { |c| c['name'] }.map do |key, value|
[key, [value.group_by { |c| c['folder']}]]
end.to_h
=> {"name1"=>
[{"folder1"=>[
{"name"=>"name1", "folder"=>"folder1", "id"=>1},
{"name"=>"name1", "folder"=>"folder1", "id"=>2}],
"folder2"=>[
{"name"=>"name1", "folder"=>"folder2", "id"=>3}]}],
"name2"=>
[{"folder1"=>[
{"name"=>"name2", "folder"=>"folder1", "id"=>4}]}]
}
Upvotes: 2
Reputation: 40536
This seems to do what you want:
transformed_hash = initial_hash
.group_by { |x| x['name'] }
.map { |k, v| [k, v.group_by{ |x| x['folder'] }] }
.to_h
Upvotes: 3