initial_hash = [
{"name" => "name1", "folder" => "folder1", :id => 1 },
{"name" => "name1", "folder" => "folder1", :id => 2 },
{"name" => "name1", "folder" => "folder2", :id => 3 },
{"name" => "name2", "folder" => "folder1", :id => 4 }]
transformed_hash = initial_hash
.group_by { |x| x['name'] }
.map { |k, v| [k, v.group_by{ |x| x['folder'] }] }
.to_h
require 'pp'
pp transformed_hash
aW5pdGlhbF9oYXNoID0gWwogIHsibmFtZSIgPT4gIm5hbWUxIiwgImZvbGRlciIgPT4gImZvbGRlcjEiLCA6aWQgPT4gMSB9LAogIHsibmFtZSIgPT4gIm5hbWUxIiwgImZvbGRlciIgPT4gImZvbGRlcjEiLCA6aWQgPT4gMiB9LAogIHsibmFtZSIgPT4gIm5hbWUxIiwgImZvbGRlciIgPT4gImZvbGRlcjIiLCA6aWQgPT4gMyB9LAogIHsibmFtZSIgPT4gIm5hbWUyIiwgImZvbGRlciIgPT4gImZvbGRlcjEiLCA6aWQgPT4gNCB9XQoKdHJhbnNmb3JtZWRfaGFzaCA9IGluaXRpYWxfaGFzaAogIC5ncm91cF9ieSB7IHx4fCB4WyduYW1lJ10gfQogIC5tYXAgeyB8aywgdnwgW2ssIHYuZ3JvdXBfYnl7IHx4fCB4Wydmb2xkZXInXSB9XSB9CiAgLnRvX2gKICAKcmVxdWlyZSAncHAnCgpwcCB0cmFuc2Zvcm1lZF9oYXNoCg==
{"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}]}}