Подтвердить что ты не робот

Ruby - простой поиск пары ключ-значение в массиве хэшей

Предположим, что у меня есть этот массив хэшей:

[
{"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"}
]

Как я могу проанализировать значение " href" хеша, где "продукт" = > "bcx"

Есть ли простой способ сделать это в Ruby?

4b9b3361

Ответ 1

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"

Обратите внимание, что это работает только в том случае, если элемент существует. В противном случае вы вызываете оператора подписки [] на nil, что приведет к возникновению исключения, поэтому вы можете сначала проверить это:

if h = ary.find { |h| h['product'] == 'bcx' }
  p h['href']
else
  puts 'Not found!'
end

Если вам нужно выполнить эту операцию несколько раз, вы должны создать себе структуру данных для быстрого поиска:

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"