通过键名从ruby中的多维哈希中提取特定值

Pav*_* K. 0 ruby hash hash-of-hashes

假设我有一个多维哈希,并且在其中一个子哈希中我有一个key => value对,我需要通过key检索它.我该怎么做?

示例哈希:

h={:x=>1,:y=>2,:z=>{:a=>{:k=>"needle"}}}
h={:k=>"needle"}
Run Code Online (Sandbox Code Playgroud)

关键是永远:k,我需要得到"针"

我注意到红宝石1.8中的哈希没有"扁平"功能,但如果它在那里,我想我会做的

h.flatten[:k]
Run Code Online (Sandbox Code Playgroud)

我想我需要为此编写一个递归函数?

谢谢

tad*_*man 9

您可以随时为Hash编写自己的任务特定扩展,为您完成脏工作:

class Hash
  def recursive_find_by_key(key)
    # Create a stack of hashes to search through for the needle which
    # is initially this hash
    stack = [ self ]

    # So long as there are more haystacks to search...
    while (to_search = stack.pop)
      # ...keep searching for this particular key...
      to_search.each do |k, v|
        # ...and return the corresponding value if it is found.
        return v if (k == key)

        # If this value can be recursively searched...
        if (v.respond_to?(:recursive_find_by_key))
          # ...push that on to the list of places to search.
          stack << v
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以非常简单地使用它:

h={:x=>1,:y=>2,:z=>{:a=>{:k=>"needle"}}}

puts h.recursive_find_by_key(:k).inspect
# => "needle"

h={:k=>"needle"}

puts h.recursive_find_by_key(:k).inspect
# => "needle"

puts h.recursive_find_by_key(:foo).inspect
# => nil
Run Code Online (Sandbox Code Playgroud)