如何在Ruby中将具有“数组”键的Ruby哈希转换为嵌套哈希?

3

我正在尝试弄清楚如何将这样一个复杂的哈希值转换为:

{
  ["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

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

4
不要使用Array#{first/last}自己处理数据,你可以让Ruby解构k,写成:|((k1, k2), v), memo|。根据实际数据情况,你甚至可以给它一个比k2(或者k.last)更合适的名字。 - cremno

3

真不错!厉害的一行代码! - Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接