Dado que tengo el siguiente hash de clientes , ¿hay una forma rápida de rubí (sin tener que escribir un script de varias líneas) para obtener la clave dada que quiero que coincida con el id_cliente? Por ejemplo, ¿cómo obtener la clave client_id == "2180"
?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
find
yselect
es quefind
devuelve la primera coincidencia yselect
(aliasfindAll
) devuelve todas las coincidencias.invert
) solo para encontrar un elemento.clients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}
clients.select{|key, hash| hash["client_id"] == "2180" }.keys
Ruby 1.9 y superior:
Ruby 1.8 :
Podrías usar
hash.index
Entonces, para obtener
"orange"
, puedes usar:fuente
index
.Hash#index
es renombradoHash#key
en Ruby 1.9Puedes invertir el hash.
clients.invert["client_id"=>"2180"]
devoluciones"orange"
fuente
Podría usar hashname.key (valuename)
O, una inversión puede estar en orden.
new_hash = hashname.invert
te dará unanew_hash
que te permite hacer las cosas más tradicionalmente.fuente
#invert
es una muy mala idea en este caso, ya que esencialmente está asignando memoria para objetos hash desechables solo por el hecho de encontrar una clave. Dependiendo del tamaño del hash, tiene un serio impacto en el rendimientoprueba esto:
fuente
.try(:first)
lugar de.first
evitar excepciones (si espera que sea posible que falte el valor).Ruby 2.3.0 +
puede usar un navegador seguro&.first
al final del bloque para evitar una excepciónDe acuerdo con Ruby Doc, http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key key (value) es el método para encontrar la clave en la base del valor.
devolverá el "diseñador".
fuente
De los documentos:
Pasa cada entrada en la enumeración para bloquear. Devuelve el primero para el que el bloque no es falso. Si ningún objeto coincide, llama a ifnone y devuelve su resultado cuando se especifica, o devuelve nil de lo contrario.
Si no se proporciona ningún bloque, se devuelve un enumerador.
Esto funcionó para mí:
Ver: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
fuente
La mejor manera de encontrar la clave para un valor particular es utilizar el método de clave que está disponible para un hash ...
Espero que resuelva tu problema ...
fuente
Otro enfoque que intentaría es usar
#map
Esto devolverá todas las ocurrencias de un valor dado. El guión bajo significa que no necesitamos que el valor de la clave se transfiera de modo que no se asigne a una variable. La matriz contendrá nils si los valores no coinciden, es por eso que pongo
#compact
al final.fuente
Aquí hay una manera fácil de encontrar las claves de un valor dado:
... y para encontrar el valor de una clave dada:
te dará el par clave-valor.
fuente