我有一个包含诸如......的值的哈希
EXAMPLE = {
"101" => "SO01",
"102" => "SO02",
"103" => "SO03",
"105" => %w(S005 SO04)
}
我想搜索哈希表示SO04并返回“105”或“SO03”并返回“103”。我确信有一个很好的方法可以做到这一点,但它现在正在滑倒我的脑海。我一直在使用EXAMPLE.key(),但是现在我意识到那里有数组。
答案 0 :(得分:2)
试试这个:
>> EXAMPLE = {"101" => "SO01",
"102" => "SO02",
"103" => "SO03",
"105" => %w(SO05 SO04)}
>> EXAMPLE.find { |_,v| Array(v).include?('SO02') }.try(:first)
=> "102"
>> EXAMPLE.find { |_,v| Array(v).include?('SO05') }.try(:first)
=> "105"
>> EXAMPLE.find { |_,v| Array(v).include?('SO06') }.try(:first)
=> nil
最后需要 .first
,因为#find
会返回[key, value]
数组。
如果您使用的是Ruby 2.3或更高版本,则可以使用安全导航操作符代替try
:
>> EXAMPLE.find { |_,v| Array(v).include?('SO05') }&.first
=> "105"
>> EXAMPLE.find { |_,v| Array(v).include?('SO06') }&.first
=> nil
答案 1 :(得分:1)
EXAMPLE = {
"101" => "SO01",
"102" => "SO02",
"103" => "SO03",
"105" => ["S005", "SO04"]
}
def value_to_key(h, value)
h.keys.find { |k| Array(h[k]).include?(value) }
end
value_to_key(EXAMPLE, "SO02") #=> "102"
value_to_key(EXAMPLE, "SO04") #=> "105"
value_to_key(EXAMPLE, "cat") #=> nil
注意:
Array("SO03") #=> ["SO03"]
Array(["S005", "SO04"]) #=> ["S005", "SO04"]
下面显示了一个等效但内存要求更高的方法。注释中解释了内存要求不同的原因。
def value_to_key(h, value)
h.keys.find { |k| [*h[k]].include?(value) }
end
[*"SO03"] #=> ["SO03"]
[*["S005", "SO04"]] #=> ["S005", "SO04"]