我不知道标题是否正确,但问题很简单:
我有一个值和一个键。
密钥如下:
"one.two.three"
现在,我该如何设置这个哈希表:
params['one']['two']['three'] = value
keys = "one.two.three".split '.' # => ["one", "two", "three"]
params = {}; value = 1; i = 0; # i is an index of processed keys array element
keys.reduce(params) { |hash, key|
hash[key] = if (i += 1) == keys.length
value # assign value to the last key in keys array
else
hash[key] || {} # initialize hash if it is not initialized yet (won't loose already initialized hashes)
end
}
puts params # {"one"=>{"two"=>{"three"=>1}}}
Hash#set_from_path(path, value)
,用良好、清晰、易于维护的代码编写。 - tokland使用递归:
def make_hash(keys)
keys.empty? ? 1 : { keys.shift => make_hash(keys) }
end
puts make_hash("one.two.three".split '.')
# => {"one"=>{"two"=>{"three"=>1}}}
inject
方法:key = "one.two.three"
value = 5
arr = key.split(".").reverse
arr[1..-1].inject({arr[0] => value}){ |memo, i| {i => memo} }
# => {"one"=>{"two"=>{"three"=>5}}}
hash = key.split(".").reverse[1..-1].inject({arr[0] => value}){ |memo, i| {i => memo}}
? - Tim Baasarr
。 - DNNX"one.two.three".split('.').reverse.inject(5) { |x, y| { y => x } }
的输出结果为 => {"one"=>{"two"=>{"three"=>5}}}
。 - DNNX