ale*_*ips 2 ruby recursion nested traversal
将点表示法路径(甚至是字符串数组)转换为嵌套哈希键值的最佳方法是什么?例如:我需要转换'foo.bar.baz'为'qux'如下:
{
'foo' => {
'bar' => {
'baz' => 'qux'
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在PHP中完成了这个,但是我通过在数组中创建一个键然后通过引用将tmp变量设置为该数组键的值来管理它,因此任何更改也将在数组中发生.
试试这个
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)
我可能会使用递归。例如:
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)