将哈希转换为嵌套哈希

saw*_*awa 5 ruby hash nested

这个问题与这个问题相反.

给定一个散列,每个键都有一个数组

{
    [:a, :b, :c] => 1,
    [:a, :b, :d] => 2,
    [:a, :e] => 3,
    [:f] => 4,
}
Run Code Online (Sandbox Code Playgroud)

将它转换为嵌套哈希的最佳方法是什么?

{
    :a => {
       :b => {:c => 1, :d => 2},
       :e => 3,
    },
    :f => 4,
}
Run Code Online (Sandbox Code Playgroud)

mae*_*ics 4

这是一个迭代解决方案,一个递归解决方案留给读者作为练习:

def convert(h={})
  ret = {}
  h.each do |k,v|
    node = ret
    k[0..-2].each {|x| node[x]||={}; node=node[x]}
    node[k[-1]] = v
  end
  ret
end

convert(your_hash) # => {:f=>4, :a=>{:b=>{:c=>1, :d=>2}, :e=>3}}
Run Code Online (Sandbox Code Playgroud)