web服务返回的哈希包含未知数量的嵌套哈希,其中一些包含数组,而数组又包含未知数量的嵌套哈希.

有些键不是唯一的,即存在于多个嵌套哈希中.

然而,我真正关心的所有 keys 都是独一无二的.

有没有什么方法可以给顶级散列提供一个密钥,即使密钥-值对被深埋在这个泥沼中,也能得到它的值?

(该web服务是Amazon产品广告API,根据每个产品类别中允许的结果数量和搜索类型,它给出的结果 struct 略有不同.)

推荐答案

下面是一个简单的递归解决方案:

def nested_hash_value(obj,key)
  if obj.respond_to?(:key?) && obj.key?(key)
    obj[key]
  elsif obj.respond_to?(:each)
    r = nil
    obj.find{ |*a| r=nested_hash_value(a.last,key) }
    r
  end
end

h = { foo:[1,2,[3,4],{a:{bar:42}}] }
p nested_hash_value(h,:bar)
#=> 42

Ruby相关问答推荐

如何使用另一个Ruby 中的Ruby 中的区域设置?

Ruby:对于不存在的键,使用缺省值Hash在Hash中存储Hash

Rack并发 - rack.multithread、async.callback 或两者兼而有之?

如何在 Ruby 中生成一个包含 n 个唯一随机数的列表?

Symfony 2assets资源过滤器异常中的指南针

ruby中字符的整数值?

在 Ruby 早期转义 .each { } 迭代

从索引到字符串结尾的子字符串的Ruby成语

Rails 类 << self

如何将消息附加到 RSpec 判断?

Ruby - 查看端口是否打开

如何在 ruby​​ net/http 中实现 cookie 支持?

rails 控制台、RVM 和 readline 的问题

从命令行使用Bundle 器将 gem 添加到 gemfile

确定Ruby的位置

gem 安装失败并出现 openssl 失败

obj.nil?与 obj == nil

如何在 IRB 中重新加载脚本?

如何在Ruby中将字符串拆分为仅具有给定字符的两部分?

为什么 Ruby setter 需要self .班级内的资格?