2016-10-07 3 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}] }] } 

я не нашёл правильное решение, которое дает именно этот вид или аналогичный результат.

Edit: я пытался, что и многие другие, но не нашел способ иметь два глубоких хэши уровнемера a.group_by{|line| line["name"]}.each_value {|v| v.map{|line| line["folder"]}}

+0

Добро пожаловать на переполнение стека. Пожалуйста, прочитайте «[ask]», «[mcve]» и «[Сколько усилий ожидается от пользователей Stack Overflow?] (Http://meta.stackoverflow.com/q/261592)». Мы хотели бы увидеть некоторые доказательства ваших усилий. Просить, не проявляя каких-либо попыток решить проблему, пахнет, как будто вы хотите, чтобы мы писали решение для вас, для чего не существует переполнение стека. –

ответ

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 приветствуется) –

Смежные вопросы