在Ruby中,我想做这样的事情,
我有一个像这样构建的哈希哈希。
h = {1 => {2 => {3 => "three"}},'a' => { 'b' => { 'c' => "basd"}}}
=> {"a"=>{"b"=>{"c"=>"basd"}}, 1=>{2=>{3=>"three"}}}
如果我有一个包含这样值的数组。
a = [1, 2, 3]
我想有一个方法,它将使用数组值来索引我的哈希中的嵌套键,并返回最后一个键指向的值(由前面的数组/键指导) 例如。
getHashValue([1,2,3]) should return "three" => h[1][2][3]
if a = ['a','b', 'c']
然后返回值应为basd
。
如何完成这项工作?
答案 0 :(得分:4)
然后是:
keys.inject(hash, :fetch)
或早期的Ruby版本:
keys.inject(hash) {|h, k| h[k]}
如果你确实想使用递归,那么更多的Rubyesque方法将是:
def get_value(obj, keys)
keys.empty? ? obj : get_value(obj[keys[0]], keys[1..-1])
end
答案 1 :(得分:2)
简单递归
def getValue(hash, keys, i = 0)
if i + 1 < keys.length
getValue(hash[keys[i]], keys, i + 1)
else
hash[keys[i]]
end
end
getValue(h, [1,2,3]) => "three"
getValue(h, ['a','b','c']) => "basd"
答案 2 :(得分:1)
h = {1 => {2 => {3 => "three"}},'a' => { 'b' => { 'c' => "basd"}}}
a = ['a','b', 'c']
a.inject(h, :[]) # => "basd"
h = {1 => {2 => {3 => "three"}},'a' => { 'b' => { 'c' => "basd"}}}
a = [1, 2, 3]
a.inject(h, :[]) # => "three"
答案 3 :(得分:1)
Ruby 2.3.0在Hash
和Array
上引入了a new method called dig
,完全解决了这个问题。
如果在任何嵌套级别缺少某个元素,则返回nil
。
h1 = {}
h2 = { a: {} }
h3 = { a: { b: {} } }
h4 = { a: { b: { c: 100 } } }
h1.dig(:a, :b, :c) # => nil
h2.dig(:a, :b, :c) # => nil
h3.dig(:a, :b, :c) # => nil
h4.dig(:a, :b, :c) # => 100