Answers:
您可以使用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中
您可以使用hashname.key(valuename)
或者,可以按顺序进行反转。new_hash = hashname.invert
将为您提供一个new_hash
让您更传统地做事的方法。
#invert
在这种情况下,这是一个非常糟糕的主意,因为您本质上是为了寻找密钥而为一次性哈希对象分配内存。根据哈希大小,它会严重影响性能
根据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)
它将返回“设计师”。
从文档:
传递枚举中的每个条目以进行阻止。返回第一个不为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
我希望它能解决您的问题...
这是找到给定值的键的简单方法:
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
p clients.rassoc("client_id"=>"2180")
...并找到给定键的值:
p clients.assoc("orange")
它将为您提供键值对。
find
和之间的区别在于,select
它find
返回第一个匹配项,而select
(由别名findAll
)返回所有匹配项。