2012-05-14 26 views
24

Supongamos que tengo este conjunto de hashes:Rubí búsqueda fácil para el par clave-valor en un conjunto de valores hash

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

¿Cómo puedo analizar el "href" valor del hash donde "producto" => "bcx"

¿Hay alguna manera fácil de hacer esto en Ruby?

+1

Se ha editado la pregunta porque no tiene nada que ver con JSON. –

Respuesta

49
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" 

Tenga en cuenta que esto solo funciona si el elemento existe. De lo contrario se le llama el operador de suscripción [] en nil, lo que elevará una excepción, por lo que es posible que desee comprobar que la primera:

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

Si necesita realizar esa operación varias veces, se debe elaborar una estructura de datos para una búsqueda más rápida:

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" 
+3

+1 para la sugerencia de hash. –

+1

¡Perfecto! No sabía .find era un método que podría llamar. Realmente ayuda. –

+6

@BrianW: Regla # 1 de la Programación de Ruby: aprende los métodos de 'Enumerable'. Entonces, apréndelos de nuevo. –