web-dev-qa-db-fra.com

Comment trouver une clé de hachage contenant une valeur correspondante

É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"}
}
186
Coderama

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.

167
Daniel Vandersluis

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"})
_
391
Aillyn

Vous pouvez inverser le hachage. clients.invert["client_id"=>"2180"] renvoie "orange"

47
Peter DeWeese

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.

22
boulder_ruby

essaye ça:

clients.find{|key,value| value["client_id"] == "2178"}.first
13
iNecas

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

12
Afzal Masood

De la docs:

  • (Object?) Detect (ifnone = nil) {| obj | ...}
  • (Object?) Find (ifnone = nil) {| obj | ...}
  • (Object) detect (ifnone = nil)
  • (Object) find (ifnone = nil)

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

6
Rimian

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 ...

3
Aditya Kapoor

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.

2
Jared

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.

1
Saleh Rastani