我有一个包含大量嵌套键值对的大哈希。 例如
h = {"foo" => {"bar" => {"hello" => {"world" => "result" } } } }
现在我想访问result
并按正确的顺序在数组中输入密钥。
keys_arr = ["foo", "bar", "hello", "world"]
动机很清楚,我想做以下几点:
h["foo"]["bar"]["hello"]["world"]
# => "result"
但我不知道该怎么做。我现在正在做:
key = '["' + keys_arr.join('"]["') + '"]'
eval("h"+key)
# => "result"
这看起来像一个黑客。此外,它大大降低了我在真实环境中使用哈希的能力。
请建议其他更好的方法。
答案 0 :(得分:7)
使用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"
<强>更新强>
如果您想执行以下操作: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"
答案 1 :(得分:2)
keys_arr.inject(h, :[])
会做
答案 2 :(得分:0)
另一种方式:
h = {"foo" => {"bar" => {"hello" => {"world" => 10 } } } }
keys = ["foo", "bar", "hello", "world"]
result = h
keys.each do |key|
result = result[key]
end
puts result #=>10
如果密钥可能不存在,请参见此处: