Gibt es einen schnellen Ruby-Weg (ohne ein mehrzeiliges Skript schreiben zu müssen), um den Schlüssel zu erhalten, den ich mit der client_id abgleichen möchte, wenn ich den folgenden Client- Hash habe? ZB Wie bekomme ich den Schlüssel für client_id == "2180"
?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
find
undselect
besteht darin, dassfind
die erste Übereinstimmung zurückgegeben wird undselect
(mit einem Alias versehenfindAll
) alle Übereinstimmungen zurückgegeben werden.invert
) zu erstellen, nur um einen Gegenstand zu finden.clients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}
clients.select{|key, hash| hash["client_id"] == "2180" }.keys
Ruby 1.9 und höher:
Ruby 1.8 :
Du könntest benutzen
hash.index
Um zu bekommen
"orange"
, könnten Sie einfach verwenden:quelle
index
.Hash#index
wirdHash#key
in Ruby 1.9Sie können den Hash invertieren.
clients.invert["client_id"=>"2180"]
kehrt zurück"orange"
quelle
Sie könnten hashname.key (valuename) verwenden
Oder eine Inversion kann angebracht sein.
new_hash = hashname.invert
gibt Ihnen einenew_hash
, mit der Sie Dinge traditioneller machen können.quelle
#invert
ist in diesem Fall eine wirklich schlechte Idee, da Sie im Wesentlichen Speicher für wegwerfbare Hash-Objekte zuweisen, nur um einen Schlüssel zu finden. Abhängig von der Hash-Größe hat dies schwerwiegende Auswirkungen auf die LeistungVersuche dies:
quelle
.try(:first)
anstatt sie.first
zu vermeiden (wenn Sie erwarten, dass der Wert möglicherweise fehlt).Ruby 2.3.0 +
Sie den sicheren Navigator&.first
am Ende des Blocks verwenden, um eine Null-Ausnahme zu verhindernLaut Ruby Doc http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key Schlüssel (Wert) ist die Methode, um den Schlüssel auf der Basis des Wertes zu finden.
es wird den "Designer" zurückgeben.
quelle
Aus den Dokumenten:
Übergibt jeden Eintrag in enum an block. Gibt den ersten zurück, für den der Block nicht falsch ist. Wenn kein Objekt übereinstimmt, ruft ifnone auf und gibt das Ergebnis zurück, wenn es angegeben wird, oder gibt andernfalls nil zurück.
Wenn kein Block angegeben ist, wird stattdessen ein Enumerator zurückgegeben.
Das hat bei mir funktioniert:
Siehe: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
quelle
Der beste Weg, um den Schlüssel für einen bestimmten Wert zu finden, ist die Verwendung der Schlüsselmethode, die für einen Hash verfügbar ist.
Ich hoffe es löst dein Problem ...
quelle
Ein anderer Ansatz, den ich versuchen würde, ist die Verwendung
#map
Dies gibt alle Vorkommen mit einem bestimmten Wert zurück. Der Unterstrich bedeutet, dass der Schlüsselwert nicht übertragen werden muss, damit er keiner Variablen zugewiesen wird. Das Array enthält Nullen, wenn die Werte nicht übereinstimmen - deshalb habe ich
#compact
am Ende gesetzt.quelle
Hier ist eine einfache Möglichkeit, die Schlüssel eines bestimmten Werts zu finden:
... und um den Wert eines bestimmten Schlüssels zu ermitteln:
Sie erhalten das Schlüssel-Wert-Paar.
quelle