Étant donné que j’ai les informations ci-dessous clients hash, existe-t-il un moyen rapide Ruby (sans avoir à écrire un script multiligne) pour obtenir la clé donnée Je veux faire correspondre le client_id? Par exemple. Comment obtenir la clé pour client_id == "2180"
?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
Vous pouvez utiliser Enumerable # select :
clients.select{|key, hash| hash["client_id"] == "2180" }
#=> [["orange", {"client_id"=>"2180"}]]
Notez que le résultat sera un tableau de toutes les valeurs correspondantes, chacune étant un tableau de la clé et de la valeur.
Ruby 1.9 et plus:
_hash.key(value) => key
_
Ruby 1.8 :
Vous pouvez utiliser hash.index
hsh.index(value) => key
Retourne la clé pour une valeur donnée. Si non trouvé, retourne
nil
._
h = { "a" => 100, "b" => 200 }
_h.index(200) #=> "b"
h.index(999) #=> nil
Donc, pour obtenir _"orange"
_, vous pouvez simplement utiliser:
_clients.key({"client_id" => "2180"})
_
Vous pouvez inverser le hachage. clients.invert["client_id"=>"2180"]
renvoie "orange"
Vous pouvez utiliser hashname.key (nomvalu)
Ou, une inversion peut être dans l'ordre. new_hash = hashname.invert
vous donnera un new_hash
qui vous permet de faire les choses plus traditionnellement.
essaye ça:
clients.find{|key,value| value["client_id"] == "2178"}.first
Selon Ruby doc http://www.Ruby-doc.org/core-1.9.3/Hash.html#method-i-key la clé (valeur) est la méthode pour trouver la clé sur la base de la valeur.
ROLE = {"customer" => 1, "designer" => 2, "admin" => 100}
ROLE.key(2)
il retournera le "designer".
De la docs:
Passe chaque entrée enum à bloquer. Retourne le premier pour lequel le bloc n'est pas faux. Si aucun objet ne correspond, appelle ifnone et renvoie son résultat lorsqu'il est spécifié ou renvoie nil sinon.
Si aucun bloc n'est donné, un énumérateur est retourné à la place.
(1..10).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> nil
(1..100).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> 35
Cela a fonctionné pour moi:
clients.detect{|client| client.last['client_id'] == '2180' } #=> ["orange", {"client_id"=>"2180"}]
clients.detect{|client| client.last['client_id'] == '999999' } #=> nil
Voir: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
La meilleure façon de trouver la clé pour une valeur particulière consiste à utiliser la méthode de clé disponible pour un hachage ....
gender = {"MALE" => 1, "FEMALE" => 2}
gender.key(1) #=> MALE
J'espère que cela résoudra votre problème ...
Une autre approche que je voudrais essayer est d'utiliser #map
clients.map{ |key, _| key if clients[key] == {"client_id"=>"2180"} }.compact
#=> ["orange"]
Cela retournera toutes les occurrences de valeur donnée. Le trait de soulignement signifie que nous n’avons pas besoin que la valeur de la clé soit véhiculée, elle ne doit donc pas être affectée à une variable. Le tableau contiendra nils si les valeurs ne correspondent pas - c’est pourquoi j’ai mis #compact
à la fin.
Voici un moyen facile de trouver les clés d’une valeur donnée:
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
p clients.rassoc("client_id"=>"2180")
... et pour trouver la valeur d'une clé donnée:
p clients.assoc("orange")
cela vous donnera la paire clé-valeur.