ruby使用数组tvalues来索引哈希的嵌套哈希

在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

怎么做到这一点?

然后是:

 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 

简单的递归

 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" 
 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" 

Ruby 2.3.0在HashArray上引入了一个名为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