Ruby点表示法到嵌套的哈希键

ale*_*ips 2 ruby recursion nested traversal

将点表示法路径(甚至是字符串数组)转换为嵌套哈希键值的最佳方法是什么?例如:我需要转换'foo.bar.baz''qux'如下:

{
    'foo' => {
        'bar' => {
            'baz' => 'qux'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在PHP中完成了这个,但是我通过在数组中创建一个键然后通过引用将tmp变量设置为该数组键的值来管理它,因此任何更改也将在数组中发生.

Bal*_*ala 8

试试这个

f = "root/sub-1/sub-2/file"   
f.split("/").reverse.inject{|a,n| {n=>a}} #=>{"root"=>{"sub-1"=>{"sub-2"=>"file"}}}
Run Code Online (Sandbox Code Playgroud)


Cur*_*tis 5

我可能会使用递归。例如:

def hasherizer(arr, value)
  if arr.empty?
    value
  else
    {}.tap do |hash|
      hash[arr.shift] = hasherizer(arr, value)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这导致:

> hasherizer 'foo.bar.baz'.split('.'), 'qux'
 => {"foo"=>{"bar"=>{"baz"=>"qux"}}}
Run Code Online (Sandbox Code Playgroud)