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

时间:2013-07-08 20:15:23

标签: ruby

在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

如何完成这项工作?

4 个答案:

答案 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在HashArray上引入了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