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]}

如果你确实想使用递归,一个更鲁比斯克的方法是:

def get_value(obj, keys)
  keys.empty? ? obj : get_value(obj[keys[0]], keys[1..-1])
end

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

简单递归

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"

最新更新