2

在 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

4 回答 4

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
于 2013-07-08T20:29:00.020 回答
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"
于 2013-07-08T20:19:56.407 回答
2

Ruby 2.3.0 引入了一种新方法,在这两者上都调用digHash了,Array它完全解决了这个问题。

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
于 2016-01-06T03:19:21.533 回答
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"
于 2013-07-08T20:32:35.563 回答