假设我有下面的客户哈希,是否有一个快速的ruby方法(无需编写多行脚本)来获取密钥,给定我想匹配client_id?例如:如何获取client_id ==“2180”的密钥?

clients = {
  "yellow"=>{"client_id"=>"2178"}, 
  "orange"=>{"client_id"=>"2180"}, 
  "red"=>{"client_id"=>"2179"}, 
  "blue"=>{"client_id"=>"2181"}
}

当前回答

从文档中可以看出:

(对象?)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

其他回答

试试这个:

clients.find{|key,value| value["client_id"] == "2178"}.first

你可以求哈希值的倒数。客户。Invert ["client_id"=>"2180"]返回"orange"

找到特定值的键的最佳方法是使用可用于散列....的key方法

gender = {"MALE" => 1, "FEMALE" => 2}
gender.key(1) #=> MALE

我希望它能解决你的问题…

你可以使用Enumerable#select:

clients.select{|key, hash| hash["client_id"] == "2180" }
#=> [["orange", {"client_id"=>"2180"}]]

注意,结果将是所有匹配值的数组,其中每个值都是键和值的数组。

我尝试的另一种方法是使用#map

clients.map{ |key, _| key if clients[key] == {"client_id"=>"2180"} }.compact 
#=> ["orange"]

这将返回给定值的所有出现次数。下划线表示我们不需要携带key的值这样它就不会被赋值给变量。如果值不匹配,数组将包含nil -这就是为什么我把#compact放在末尾。