2012-05-14 6 views
24

Ich habe Angenommen, dieses Array von Hashes:Rubin einfache Suche nach Schlüssel-Wert-Paar in einem Array von Hashes

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

Wie kann ich den „href“ Wert des Hash wo „Produkt“ parse => "bcx"

Gibt es einen einfachen Weg, dies in Ruby zu tun?

+1

Bearbeitet die Frage, weil es nichts mit JSON zu tun hat. –

Antwort

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" 

Beachten Sie, dass dies nur funktioniert, wenn das Element existiert. Sonst werden Sie das Abonnement Operator [] auf nil anrufen, die eine Ausnahme ausgelöst wird, so dass Sie möglicherweise für das erste überprüfen möchten:

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

Wenn Sie, dass der Betrieb mehrere Male ausführen müssen, sollten Sie sich bauen ein Datenstruktur für schnellere Suche:

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 für den Hash-Vorschlag. –

+1

Perfekt! Wusste nicht. Find war eine Methode, die man anrufen konnte. Wirklich hilft. –

+6

@Brianw: Regel # 1 von Ruby Programming: Lernen Sie die Methoden von 'Enumerable'. Dann lerne sie wieder. –

Verwandte Themen