답변:
Enumerable # select 사용할 수 있습니다 :
clients.select{|key, hash| hash["client_id"] == "2180" }
#=> [["orange", {"client_id"=>"2180"}]]
결과는 일치하는 모든 값의 배열이며 각 값은 키와 값의 배열입니다.
invert
항목을 찾기 위해 완전히 새로운 해시를 작성하는 것 (을 호출하여 ) 보다 낫습니다 .
clients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}
clients.select{|key, hash| hash["client_id"] == "2180" }.keys
루비 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"})
index
있습니다.
Hash#index
로 이름이 변경되는 Hash#key
루비 1.9
해시를 뒤집을 수 있습니다. clients.invert["client_id"=>"2180"]
보고"orange"
hashname.key (valuename)를 사용할 수 있습니다
또는 역순 일 수도 있습니다. new_hash = hashname.invert
당신에게 줄 것이다 new_hash
당신이 더 많은 전통적으로 일을 할 수 있다는 것입니다.
#invert
이 경우에는 키를 찾기 위해 버리기 해시 객체에 메모리를 할당하기 때문에이 방법은 정말 나쁜 생각입니다. 해시 크기에 따라 성능에 심각한 영향을 미칩니다
이 시도:
clients.find{|key,value| value["client_id"] == "2178"}.first
.try(:first)
하는 .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)
"디자이너"를 반환합니다.
문서에서 :
열거 형의 각 항목을 블록으로 전달합니다. 블록이 거짓이 아닌 첫 번째를 반환합니다. 일치하는 객체가 없으면 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
특정 값의 키를 찾는 가장 좋은 방법은 해시에서 사용할 수있는 키 방법을 사용하는 것입니다.
gender = {"MALE" => 1, "FEMALE" => 2}
gender.key(1) #=> MALE
문제가 해결되기를 바랍니다.
find
및select
즉find
리턴 제와 매치select
(별칭으로한다findAll
) 모든 경기를 반환한다.