检查散列值的方法,该值可以是单个字符串或字符串数​​组

时间:2016-12-22 19:16:02

标签: ruby-on-rails ruby

我有一个包含诸如......的值的哈希

    EXAMPLE = {
      "101" => "SO01",
      "102" => "SO02",
      "103" => "SO03",
      "105" => %w(S005 SO04)
    }

我想搜索哈希表示SO04并返回“105”或“SO03”并返回“103”。我确信有一个很好的方法可以做到这一点,但它现在正在滑倒我的脑海。我一直在使用EXAMPLE.key(),但是现在我意识到那里有数组。

2 个答案:

答案 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"]