假设我有下面的客户哈希,是否有一个快速的ruby方法(无需编写多行脚本)来获取密钥,给定我想匹配client_id?例如:如何获取client_id ==“2180”的密钥?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
假设我有下面的客户哈希,是否有一个快速的ruby方法(无需编写多行脚本)来获取密钥,给定我想匹配client_id?例如:如何获取client_id ==“2180”的密钥?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
当前回答
Ruby 1.9及更高版本:
hash.key(value) => key
Ruby 1.8:
你可以使用hash.index
Hsh.index (value) =>键 返回给定值的键。如果 未找到,返回nil。 H = {"a" => 100, "b" => 200} H.index (200) #=> "b" H.index (999) #=> nil
所以要得到"orange",你可以用:
clients.key({"client_id" => "2180"})
其他回答
找到特定值的键的最佳方法是使用可用于散列....的key方法
gender = {"MALE" => 1, "FEMALE" => 2}
gender.key(1) #=> MALE
我希望它能解决你的问题…
Ruby 1.9及更高版本:
hash.key(value) => key
Ruby 1.8:
你可以使用hash.index
Hsh.index (value) =>键 返回给定值的键。如果 未找到,返回nil。 H = {"a" => 100, "b" => 200} H.index (200) #=> "b" H.index (999) #=> nil
所以要得到"orange",你可以用:
clients.key({"client_id" => "2180"})
试试这个:
clients.find{|key,value| value["client_id"] == "2178"}.first
这里有一个简单的方法来找到给定值的键:
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")
它会给你一个键值对。
从文档中可以看出:
(对象?)detect(ifnone = nil) {|obj|…} (对象?)find(ifnone = nil) {|obj|…} (对象)检测(ifnone = nil) (对象)find(ifnone = nil)
将枚举中的每个条目传递给block。返回第一个不为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