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

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

当前回答

你可以使用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放在末尾。

这里有一个简单的方法来找到给定值的键:

    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") 

它会给你一个键值对。

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

你可以使用hashname。key(valuename)

或者,反转也可以。New_hash = hashname。Invert会给你一个new_hash,让你做一些更传统的事情。

你可以使用Enumerable#select:

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

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