假设我有以下clients哈希表,有没有一种快速的ruby方法(而不必编写多行脚本)来获取键名,以便匹配client_id?例如: 如何获取client_id == "2180"
的键名?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
假设我有以下clients哈希表,有没有一种快速的ruby方法(而不必编写多行脚本)来获取键名,以便匹配client_id?例如: 如何获取client_id == "2180"
的键名?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
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"})
clients.select{|key, hash| hash["client_id"] == "2180" }
#=> [["orange", {"client_id"=>"2180"}]]
请注意,结果将是一个包含所有匹配值的数组,其中每个值都是键和值的数组。
find
和 select
的区别在于,find
返回第一个匹配项,而 select
(别名为 findAll
)返回所有匹配项。 - Daniel Vandersluisclients.select{|key, hash| hash["client_id"] == "2180" }.keys
- Mirror318clients.invert["client_id"=>"2180"]
返回 "orange"
。#invert
是一个非常糟糕的想法,因为你实际上是为了查找一个键而分配了一块可丢弃的哈希对象的内存。根据哈希大小,它将会对性能产生严重的影响。 - Dr.Strangelove试试这个:
clients.find{|key,value| value["client_id"] == "2178"}.first
.try(:first)
而不是.first
来避免异常(如果您预计该值可能会丢失)。 - aaron-codingROLE = {"customer" => 1, "designer" => 2, "admin" => 100}
ROLE.key(2)
它将返回“designer”。
从文档中得知:
将枚举中的每个条目传递给块。 返回第一个不为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
See: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
寻找特定值的键的最佳方法是使用哈希可用的键方法....
gender = {"MALE" => 1, "FEMALE" => 2}
gender.key(1) #=> MALE
我希望它能解决你的问题...
另一种我会尝试的方法是使用 #map
clients.map{ |key, _| key if clients[key] == {"client_id"=>"2180"} }.compact
#=> ["orange"]
#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")
index
。 - Daniel VandersluisHash#index
方法被重命名为Hash#key
。 - Vikrant Chaudhary