如何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")
它会给你的键值对。