[ruby] 일치하는 값이 포함 된 해시 키를 찾는 방법

아래에 클라이언트 해시가 있다고 가정하면 client_id와 일치 시키려면 주어진 키를 얻는 빠른 루비 방법이 있습니까 (여러 줄 스크립트를 작성하지 않아도 됨)? 예를 들어 열쇠를 얻는 방법 client_id == "2180"?

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



답변

Enumerable # select 사용할 수 있습니다 :

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

결과는 일치하는 모든 값의 배열이며 각 값은 키와 값의 배열입니다.


답변

루비 1.9 이상 :

hash.key(value) => key

루비 1.8 :

당신은 사용할 수 있습니다 hash.index

hsh.index(value) => key

주어진 값의 키를 반환합니다. 찾을 수 없으면를 반환합니다 nil.

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

따라서를 얻으려면 "orange"다음을 사용할 수 있습니다.

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


답변

해시를 뒤집을 수 있습니다. clients.invert["client_id"=>"2180"]보고"orange"


답변

hashname.key (valuename)를 사용할 수 있습니다

또는 역순 일 수도 있습니다. new_hash = hashname.invert당신에게 줄 것이다 new_hash당신이 더 많은 전통적으로 일을 할 수 있다는 것입니다.


답변

이 시도:

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


답변

루비 문서에 따르면 http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key key (value)는 값을 기준으로 키를 찾는 방법입니다.

ROLE = {"customer" => 1, "designer" => 2, "admin" => 100}
ROLE.key(2)

“디자이너”를 반환합니다.


답변

문서에서 :

  • (Object?) detect (ifnone = nil) {| obj | …}
  • (개체?) find (ifnone = nil) {| obj | …}
  • (객체) 감지 (ifnone = nil)
  • (객체) find (ifnone = nil)

열거 형의 각 항목을 블록으로 전달합니다. 블록이 거짓이 아닌 첫 번째를 반환합니다. 일치하는 객체가 없으면 ifnone을 호출하고 지정된 경우 결과를 반환하거나 그렇지 않으면 nil을 반환합니다.

블록을 지정하지 않으면 열거자가 대신 반환됩니다.

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

이것은 나를 위해 일했다 :

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

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

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