Étant donné que j'ai le hachage des clients ci-dessous , y a-t-il un moyen rapide (sans avoir à écrire un script multi-lignes) pour obtenir la clé étant donné que je veux faire correspondre le client_id? Par exemple, comment obtenir la clé client_id == "2180"
?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
find
etselect
est quefind
renvoie la première correspondance etselect
(qui est aliasée parfindAll
) renvoie toutes les correspondances.invert
) juste pour trouver un élément.clients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}
clients.select{|key, hash| hash["client_id"] == "2180" }.keys
Ruby 1.9 et supérieur:
Rubis 1.8 :
Vous pourriez utiliser
hash.index
Donc, pour obtenir
"orange"
, vous pouvez simplement utiliser:la source
index
.Hash#index
est renomméHash#key
en Ruby 1.9Vous pouvez inverser le hachage.
clients.invert["client_id"=>"2180"]
Retour"orange"
la source
Vous pouvez utiliser hashname.key (nom de valeur)
Ou, une inversion peut être en ordre.
new_hash = hashname.invert
vous donnera unnew_hash
qui vous permet de faire les choses de façon plus traditionnelle.la source
#invert
est une très mauvaise idée dans ce cas, car vous allouez essentiellement de la mémoire pour un objet de hachage à jeter juste pour trouver une clé. Selon la taille du hachage, cela a un impact sérieux sur les performancesessaye ça:
la source
.try(:first)
au lieu de.first
pour éviter les exceptions (si vous vous attendez à ce que la valeur soit manquante).Ruby 2.3.0 +
vous pouvez utiliser le navigateur en toute sécurité&.first
à la fin du bloc pour empêcher de Nil ExceptionSelon ruby doc http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key key (value) est la méthode pour trouver la clé sur la base de la valeur.
il renverra le "designer".
la source
De la documentation:
Passe chaque entrée enum à bloquer. Renvoie 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 renvoyé à la place.
Cela a fonctionné pour moi:
Voir: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
la source
La meilleure façon de trouver la clé pour une valeur particulière est d'utiliser la méthode de clé disponible pour un hachage ....
J'espère que cela résout votre problème ...
la source
Une autre approche que j'essaierais serait d'utiliser
#map
Cela renverra 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 transportée pour qu'elle ne soit pas affectée à une variable. Le tableau contiendra nils si les valeurs ne correspondent pas - c'est pourquoi je mets
#compact
à la fin.la source
Voici un moyen simple de trouver les clés d'une valeur donnée:
... et pour trouver la valeur d'une clé donnée:
il vous donnera la paire clé-valeur.
la source