Как преобразовать рубиновый хеш с ключом 'массива' во вложенный хеш в Ruby? - PullRequest
3 голосов
/ 01 октября 2019

Я пытаюсь выяснить, как я могу преобразовать сложный хеш следующим образом:

{
  ["A", "B"]=>{"id"=>123,"name"=>"test"},
  ["A", "F"]=>{"id"=>236,"name"=>"another test"},
  ["C", "F"]=>{"id"=>238,"name"=>"anoother test"}
}

в еще более сложный хеш, такой как

{
  "A"=>{
     "B"=>{"id"=>123,"name"=>"test"},
     "F"=>{"id"=>236,"name"=>"another test"}
  },
  "C"=>{
     "F"=>{"id"=>238,"name"=>"anoother test"}
  }
}

Любая помощь будет действительнодобро пожаловать!

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

Вы также можете использовать Enumerable # group_by затем Hash # transform_values ​​ by Enumerable # map для нового хэша, используя Array # to_h :

h.group_by { |h,k| h.first }.transform_values { |v| v.map { |a, b| [a.last, b] }.to_h }
3 голосов
/ 01 октября 2019

each_with_object может быть спасением:

hash.each_with_object(Hash.new {|h, k| h[k] = {}}) do |((first, last), v), memo|  
  memo[first].merge!(last => v)
end
#=> {"A"=>{"B"=>{"id"=>123, "name"=>"test"}, 
#          "F"=>{"id"=>236, "name"=>"another test"}}, 
#    "C"=>{"F"=>{"id"=>238, "name"=>"anoother test"}}}
...