如何查找包含匹配值的哈希键

时间:2010-09-25 13:38:19

标签: ruby

鉴于我有以下客户端哈希,是否有一种快速的ruby方式(无需编写多行脚本)来获取我希望匹配client_id的密钥?例如。如何获取client_id == "2180"的密钥?

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

10 个答案:

答案 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)

来自文档:

  • (对象?)检测(ifnone = nil){| obj | ......}
  • (对象?)find(ifnone = nil){| obj | ......}
  • (对象)检测(ifnone = nil)
  • (对象)find(ifnone = nil)

将枚举中的每个条目传递给阻止。返回第一个块不为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") 

它将为您提供键值对。