使用Ruby中的inject方法创建哈希键

时间:2015-09-23 07:47:27

标签: ruby hash

用于访问以下哈希中的嵌套值:

 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

2 个答案:

答案 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

为散列键指定值将返回分配的值,而不是散列值。因此,您必须显式添加到迭代代码的末尾,这是一个返回正在构建的哈希的调用。