shi*_*vam 2 ruby arrays hash ruby-1.8.7
我有一个包含大量嵌套键值对的大哈希.例如.
h = {"foo" => {"bar" => {"hello" => {"world" => "result" } } } }
Run Code Online (Sandbox Code Playgroud)
现在我想访问,result并按顺序在数组中输入密钥.
keys_arr = ["foo", "bar", "hello", "world"]
Run Code Online (Sandbox Code Playgroud)
动机很清楚,我想做的是:
h["foo"]["bar"]["hello"]["world"]
# => "result"
Run Code Online (Sandbox Code Playgroud)
但我不知道该怎么做.我目前在做:
key = '["' + keys_arr.join('"]["') + '"]'
eval("h"+key)
# => "result"
Run Code Online (Sandbox Code Playgroud)
这看起来像一个黑客.此外,它大大降低了我在真实环境中使用哈希的能力.
请建议其他更好的方法.
使用Enumerable#inject(或Enumerable#reduce):
h = {"foo" => {"bar" => {"hello" => {"world" => "result" } } } }
keys_arr = ["foo", "bar", "hello", "world"]
keys_arr.inject(h) { |x, k| x[k] }
# => "result"
Run Code Online (Sandbox Code Playgroud)
UPDATE
如果你想做类似的事情: h["foo"]["bar"]["hello"]["world"] = "ruby"
innermost = keys_arr[0...-1].inject(h) { |x, k| x[k] } # the innermost hash
innermost[keys_arr[-1]] = "ruby"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |