Ruby可以轻松搜索散列数组中的键值对

Bri*_*ich 24 ruby arrays

假设我有这个哈希数组:

[
{"href"=>"https://company.campfirenow.com", "name"=>"Company", "id"=>123456789, "product"=>"campfire"},
{"href"=>"https://basecamp.com/123456789/api/v1", "name"=>"Company", "id"=>123456789, "product"=>"bcx"}, 
{"href"=>"https://company.highrisehq.com", "name"=>"Company", "id"=>123456789, "product"=>"highrise"}
]
Run Code Online (Sandbox Code Playgroud)

如何解析哈希的" href "值,其中"product"=>"bcx"

有没有简单的方法在Ruby中执行此操作?

Nik*_* B. 50

ary = [
  {"href"=>"https://company.campfirenow.com", "name"=>"Company", "id"=>123456789, "product"=>"campfire"},
  {"href"=>"https://basecamp.com/123456789/api/v1", "name"=>"Company", "id"=>123456789, "product"=>"bcx"}, 
  {"href"=>"https://company.highrisehq.com", "name"=>"Company", "id"=>123456789, "product"=>"highrise"}
]

p ary.find { |h| h['product'] == 'bcx' }['href']
# => "https://basecamp.com/123456789/api/v1"
Run Code Online (Sandbox Code Playgroud)

请注意,这仅在元素存在时才有效.否则你将被调用订阅操作[]nil,这将引发异常,所以你可能要检查的是第一:

if h = ary.find { |h| h['product'] == 'bcx' }
  p h['href']
else
  puts 'Not found!'
end
Run Code Online (Sandbox Code Playgroud)

如果您需要多次执行该操作,您应该自己构建一个数据结构以加快查找速度:

href_by_product = Hash[ary.map { |h| h.values_at('product', 'href') }]
p href_by_product['campfire'] # => "https://company.campfirenow.com"
p href_by_product['bcx']      # => "https://basecamp.com/123456789/api/v1"
Run Code Online (Sandbox Code Playgroud)

  • @BrianW:Ruby Programming的第1条规则:学习"Enumerable"的方法.然后,再次学习它们. (6认同)