Dado que tenho o hash de clientes abaixo , existe uma maneira rápida de ruby (sem a necessidade de escrever um script de várias linhas) para obter a chave, pois quero corresponder ao client_id? Por exemplo, como obter a chave client_id == "2180"
?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
find
eselect
é quefind
retorna a primeira correspondência eselect
(com o apelido defindAll
) retorna todas as correspondências.invert
) apenas para encontrar um item.clients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}
clients.select{|key, hash| hash["client_id"] == "2180" }.keys
Ruby 1.9 e superior:
Ruby 1.8 :
Você poderia usar
hash.index
Então, para obter
"orange"
, você pode simplesmente usar:fonte
index
.Hash#index
é renomeado paraHash#key
Ruby 1.9Você pode inverter o hash.
clients.invert["client_id"=>"2180"]
retorna"orange"
fonte
Você pode usar hashname.key (nome do valor)
Ou, uma inversão pode estar em ordem.
new_hash = hashname.invert
lhe dará umnew_hash
que permite fazer as coisas de maneira mais tradicional.fonte
#invert
é uma péssima idéia nesse caso, pois você está essencialmente alocando memória para o objeto hash descartável apenas para encontrar uma chave. Dependendo do tamanho do hash ter graves impacto no desempenhotente isto:
fonte
.try(:first)
vez de.first
evitar exceções (se você espera que o valor esteja ausente).Ruby 2.3.0 +
que você pode usar navegador seguro&.first
no final do bloco para impedir Nil ExceçãoDe acordo com o ruby doc, http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key key (value) é o método para encontrar a chave na base do valor.
retornará o "designer".
fonte
Dos documentos:
Passa cada entrada em enum para bloquear. Retorna o primeiro para o qual o bloco não é falso. Se nenhum objeto corresponder, chama ifnone e retorna seu resultado quando especificado, ou retorna nil caso contrário.
Se nenhum bloco for fornecido, um enumerador será retornado.
Isso funcionou para mim:
Consulte: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
fonte
A melhor maneira de encontrar a chave para um valor específico é usar o método de chave disponível para um hash ....
Espero que resolva o seu problema ...
fonte
Outra abordagem que eu tentaria é usar
#map
Isso retornará todas as ocorrências de determinado valor. O sublinhado significa que não precisamos que o valor da chave seja transportado para que não seja atribuído a uma variável. A matriz conterá nils se os valores não corresponderem - é por isso que eu coloco
#compact
no final.fonte
Aqui está uma maneira fácil de encontrar as chaves de um determinado valor:
... e para encontrar o valor de uma determinada chave:
ele fornecerá o par de valores-chave.
fonte