Biorąc pod uwagę, że mam poniższy skrót klientów , czy istnieje szybki rubinowy sposób (bez konieczności pisania skryptu składającego się z wielu wierszy), aby uzyskać klucz, biorąc pod uwagę, że chcę dopasować identyfikator klienta? Np. Jak zdobyć klucz client_id == "2180"
?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
find
iselect
polega na tym, żefind
zwraca pierwsze dopasowanie, aselect
(które jest aliasowanefindAll
) zwraca wszystkie dopasowania.invert
) tylko w celu znalezienia elementu.clients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}
clients.select{|key, hash| hash["client_id"] == "2180" }.keys
Ruby 1.9 i nowszy:
Ruby 1.8 :
Możesz użyć
hash.index
Aby uzyskać
"orange"
, możesz po prostu użyć:źródło
index
.Hash#index
przemianowano naHash#key
Ruby 1.9Możesz odwrócić skrót.
clients.invert["client_id"=>"2180"]
zwroty"orange"
źródło
Możesz użyć hashname.key (nazwa wartości)
Lub odwrócenie może być w porządku.
new_hash = hashname.invert
da ci coś,new_hash
co pozwala robić rzeczy bardziej tradycyjnie.źródło
#invert
jest naprawdę złym pomysłem w tym przypadku, ponieważ w zasadzie alokujesz pamięć dla wyrzucanego obiektu mieszającego tylko ze względu na znalezienie klucza. W zależności od wielkości skrótu ma to poważny wpływ na wydajnośćSpróbuj tego:
źródło
.try(:first)
zamiast.first
unikać wyjątków (jeśli spodziewasz się, że będzie możliwe, że brakuje wartości).Ruby 2.3.0 +
możesz użyć bezpiecznego nawigatora&.first
na końcu bloku, aby zapobiec zerowemu wyjątkowiWedług ruby doc http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key klucz (wartość) to metoda znalezienia klucza na podstawie wartości.
zwróci „projektanta”.
źródło
Z dokumentów:
Przechodzi każdy wpis w enum do zablokowania. Zwraca pierwszy, dla którego blok nie jest fałszywy. Jeśli żaden obiekt nie pasuje, wywołuje ifnone i zwraca wynik, gdy jest określony, lub zwraca zero w przeciwnym razie.
Jeśli nie podano żadnego bloku, zamiast tego zwracany jest moduł wyliczający.
To działało dla mnie:
Zobacz: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
źródło
Najlepszym sposobem znalezienia klucza dla określonej wartości jest użycie metody klucza dostępnej dla skrótu ....
Mam nadzieję, że to rozwiąże twój problem ...
źródło
Innym podejściem, którego spróbowałbym, jest użycie
#map
Zwróci to wszystkie wystąpienia o podanej wartości. Podkreślenie oznacza, że nie potrzebujemy przenosić wartości klucza, aby w ten sposób nie był przypisany do zmiennej. Tablica będzie zawierać zero, jeśli wartości się nie zgadzają - dlatego umieszczam
#compact
na końcu.źródło
Oto prosty sposób na znalezienie kluczy o danej wartości:
... i znaleźć wartość danego klucza:
da ci parę klucz-wartość.
źródło