回答:
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
Ruby 1.9以降:
hash.key(value) => key
Ruby 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
Ruby 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
を使用して例外を回避できます(値が欠落している可能性がある場合)。
ruby docによると、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)
「デザイナー」を返します。
ドキュメントから:
enumの各エントリを渡してブロックします。ブロックがfalseでない最初のものを返します。一致するオブジェクトがない場合、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
)すべての一致を返します。