鉴于我有以下客户端哈希,是否有一种快速的ruby方式(无需编写多行脚本)来获取我希望匹配client_id的密钥?例如。如何获取client_id == "2180"
的密钥?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
答案 0 :(得分:383)
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"})
答案 1 :(得分:163)
您可以使用Enumerable#select:
clients.select{|key, hash| hash["client_id"] == "2180" }
#=> [["orange", {"client_id"=>"2180"}]]
请注意,结果将是所有匹配值的数组,其中每个值都是键和值的数组。
答案 2 :(得分:46)
您可以反转哈希值。 clients.invert["client_id"=>"2180"]
返回"orange"
答案 3 :(得分:21)
您可以使用hashname.key(valuename)
或者,反转可能是有序的。 new_hash = hashname.invert
将为您提供new_hash
,让您可以更传统地执行操作。
答案 4 :(得分:12)
试试这个:
clients.find{|key,value| value["client_id"] == "2178"}.first
答案 5 :(得分:11)
根据ruby doc http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key键(value)是在值的基础上找到键的方法。
ROLE = {"customer" => 1, "designer" => 2, "admin" => 100}
ROLE.key(2)
它将返回“设计师”。
答案 6 :(得分:5)
来自文档:
将枚举中的每个条目传递给阻止。返回第一个块不为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
答案 7 :(得分:1)
找到特定值的密钥的最佳方法是使用可用于哈希的密钥方法....
gender = {"MALE" => 1, "FEMALE" => 2}
gender.key(1) #=> MALE
我希望它能解决你的问题...
答案 8 :(得分:1)
我尝试的另一种方法是使用#map
clients.map{ |key, _| key if clients[key] == {"client_id"=>"2180"} }.compact
#=> ["orange"]
这将返回给定值的所有出现。下划线意味着我们不需要携带键的值,因此它不会被赋值给变量。如果值不匹配,数组将包含nils - 这就是我将#compact
放在最后的原因。
答案 9 :(得分:0)
这是一种简单的方法来查找给定值的键:
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")
它将为您提供键值对。