如何find包含匹配值的散列键

鉴于我有下面的客户端哈希,是否有一个快速的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"}]] 

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

Ruby 1.9及更高版本:

 hash.key(value) => key 

Ruby 1.8

你可以使用hash.index

hsh.index(value) => key

返回给定值的键。 如果没有find,则返回nil

h = { "a" => 100, "b" => 200 }
h.index(200) #=> "b"
h.index(999) #=> nil

所以要获得"orange" ,你可以使用:

 clients.key({"client_id" => "2180"}) 

你可以颠倒散列。 clients.invert["client_id"=>"2180"]返回"orange"

你可以使用hashname.key(valuename)

或者,倒置可能是有序的。 new_hash = hashname.invert会给你一个new_hash ,让你做更传统的事情。

根据ruby文档http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key键(值)是find值的基础上的方法。;

 ROLE = {"customer" => 1, "designer" => 2, "admin" => 100} ROLE.key(2) 

它会返回“devise师”。

尝试这个:

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

从文档:

  • (Object?)detect(ifnone = nil){| obj | …}
  • (Object?)find(ifnone = nil){| obj | …}
  • (Object)detect(ifnone = nil)
  • (Object)find(ifnone = nil)

传入enum中的每个条目以阻止。 返回第一个块不是假的。 如果没有对象匹配,则调用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

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

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

这将返回给定值的所有事件。 下划线表示我们不需要密钥的价值,因此它不会被分配给一个variables。 如果值不匹配,数组将包含nils – 这就是为什么我把#compact放在最后。

find特定值的关键的最佳方法是使用可用于散列的关键方法….

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

我希望能解决你的问题

下面是一个简单的方法来find给定值的键:

  clients = { "yellow"=>{"client_id"=>"2178"}, "orange"=>{"client_id"=>"2180"}, "red"=>{"client_id"=>"2179"}, "blue"=>{"client_id"=>"2181"} } p clients.rassoc("client_id"=>"2180") 

…并find给定密钥的值:

  p clients.assoc("orange") 

它会给你的键值对。