value - update hash ruby




Como encontrar uma chave hash contendo um valor correspondente (7)

Dado que eu tenho o hash abaixo dos clientes , há uma maneira rápida de ruby ​​(sem ter que escrever um script multi-line) para obter a chave dada que eu quero corresponder ao client_id? Por exemplo, como obter a chave para client_id == "2180" ?

clients = {
  "yellow"=>{"client_id"=>"2178"}, 
  "orange"=>{"client_id"=>"2180"}, 
  "red"=>{"client_id"=>"2179"}, 
  "blue"=>{"client_id"=>"2181"}
}

A melhor maneira de encontrar a chave para um determinado valor é usar o método de chave que está disponível para um hash ....

gender = {"MALE" => 1, "FEMALE" => 2}
gender.key(1) #=> MALE

Eu espero que isso resolva seu problema ...


Aqui está uma maneira fácil de encontrar as chaves de um determinado valor:

    clients = {
      "yellow"=>{"client_id"=>"2178"}, 
      "orange"=>{"client_id"=>"2180"}, 
      "red"=>{"client_id"=>"2179"}, 
      "blue"=>{"client_id"=>"2181"}
    }

    p clients.rassoc("client_id"=>"2180")

... e para encontrar o valor de uma determinada chave:

    p clients.assoc("orange") 

isso lhe dará o par de valores-chave.


Dos docs:

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

Passa cada entrada no 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.

(1..10).detect  {|i| i % 5 == 0 and i % 7 == 0 }   #=> nil
(1..100).detect {|i| i % 5 == 0 and i % 7 == 0 }   #=> 35

Isso funcionou para mim:

clients.detect{|client| client.last['client_id'] == '2180' } #=> ["orange", {"client_id"=>"2180"}] 

clients.detect{|client| client.last['client_id'] == '999999' } #=> nil 

Veja: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method


Outra abordagem que eu tentaria é usando #map

clients.map{ |key, _| key if clients[key] == {"client_id"=>"2180"} }.compact 
#=> ["orange"]

Isso retornará todas as ocorrências de determinado valor. O sublinhado significa que não precisamos do valor da chave para ser transportado, de modo que não esteja sendo atribuído a uma variável. A matriz conterá nils se os valores não corresponderem - é por isso que coloquei #compact no final.


Você poderia usar Enumerable#select :

clients.select{|key, hash| hash["client_id"] == "2180" }
#=> [["orange", {"client_id"=>"2180"}]]

Observe que o resultado será uma matriz de todos os valores correspondentes, em que cada um é uma matriz da chave e do valor.


Você poderia usar o hashname.key (valuename)

Ou, uma inversão pode estar em ordem. new_hash = hashname.invert lhe dará um new_hash que permite fazer as coisas mais tradicionalmente.


Ruby 1.9 e maior:

hash.key(value) => key

Rubi 1.8 :

Você poderia usar o hash.index

hsh.index(value) => key

Retorna a chave para um determinado valor. Se não encontrado, retorna nil .

h = { "a" => 100, "b" => 200 }
h.index(200) #=> "b"
h.index(999) #=> nil

Então, para obter "orange" , você poderia simplesmente usar:

clients.key({"client_id" => "2180"})




ruby