2016-10-07 67 views
1

散列組我有多個散列誰是這樣的:紅寶石由多個值

[{"name" => "name1", "folder" => "folder1", id => 1 }, 

{"name" => "name1", "folder" => "folder1", id => 2 }, 

{"name" => "name1", "folder" => "folder2", id => 3}, 

{"name" => "name2", "folder" => "folder1", id => 4}] 

而我的目標是有東西誰看起來是這樣的:

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

我沒有找到一個正確的解決方案,現在就給出這種類型或類似的結果。

編輯:我想,和其他許多人,但從來沒有發現有兩個層面的深散列a.group_by{|line| line["name"]}.each_value {|v| v.map{|line| line["folder"]}}

+0

歡迎堆棧溢出。請閱讀「[問]」,「[mcve]」和「[Stack Overflow用戶需要多少研究工作?](http://meta.stackoverflow.com/q/261592)」。我們希望看到您的努力的一些證據。詢問沒有顯示任何嘗試解決問題的氣味,就像你希望我們爲你寫一個解決方案,這不是Stack Overflow的目的。 –

回答

2

這似乎的方式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 
+0

謝謝你的回答! – Gauthier

2
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}]}] 
    } 
+0

謝謝你的回答! – Gauthier

+0

@ Gauthier你的歡迎) –