用于访问以下哈希中的嵌套值:
y={"en"=>
{"slogan"=>"Sky",
"countries"=>{"AW"=>"Aruba", "AF"=>"Afghanistan"},
"op_modes"=>{"classic"=>{0=>"Alert", 10=>"Auto"}},
"reg"=>
{"headline"=>"Online",
"key1"=>"value1",
"key2"=>"value2",
"key3"=>"value3",
"key4"=>"value4",
"installation"=>
{"text1"=>
"'3.2 Tomorrow:'\n",
"gridtypes"=>{"tt"=>"TT", "tn-s"=>"TN-S"}}}}}
我有这个(在this post中找到了方法):
key = 'en.countries.AW'
ki = key.split('.')
fg = ki.inject(y) {|h, k| h[k]} # => "Aruba"
如果密钥不存在,如何分配值"x value"
?如何使用此值创建新密钥(任何深度)?
我试过这样的事情,但是有一个错误:
key = 'en.countries.new_one'
if fg.nil?
ki.inject(y) do |h, k|
h[k] = "x value"
end
end
更新
sawa的答案对我帮助很大,但我做了一些修改以达到无限级别(深度)。
key = 'en.countries.new_one'
key.split(".").inject(y) do |h, k|
h.key?(k) ? h[k] : h[k] = {}
end
答案 0 :(得分:3)
key = 'en.countries.new_one'
key.split(".").inject(y) do |h, k|
h.key?(k) ? h[k] : h[k] = "x value"
end
答案 1 :(得分:3)
使用inject来处理哈希的关键是要记住,在每次迭代时,构建的哈希需要是返回的项。
所以:
'en.countries.new_one'.split('.').inject({}) do |hash, key|
hash[key] ||= "some value"
hash
end
为散列键指定值将返回分配的值,而不是散列值。因此,您必须显式添加到迭代代码的末尾,这是一个返回正在构建的哈希的调用。