如果散列包含Ruby中的值,则返回散列键

时间:2013-10-19 18:34:30

标签: ruby hash

我有一个哈希hash,如此:

hash = {"Addaptive Accessibility"=>["one","two"],

        "Atmosphere (Feeling/Safety)"=>["three", "four"],

        "Aquatics (Size)"=>["five", "six"]}

然后我有一个数组array

array = ["one","seven"]

我需要搜索数组中每个单词的哈希值,如果找到该单词,我需要从哈希中返回关联的key。像这样:

array.each do |word|
  if hash.include? word
    puts key
  end
end

我怎么写这个,写得更好?

3 个答案:

答案 0 :(得分:3)

要回答你原来的问题,我会提出另一个我认为最容易理解的解决方案:

hash.find{|k,v| v.include? word }.first

这只会迭代直到找到匹配,即你可能会节省几个周期。与@ ArupRakshit的解决方案相反,这只会找到第一个匹配。

但我必须强调你确实在错误的方向上使用哈希 - 只需翻转键和值!

答案 1 :(得分:2)

这是怎么回事?

hash.select{ |_,v| v.any?{|e| array.include? e } }.keys
# => ["Addaptive Accessibility"]
hash.select{ |_,v| v.any?(&array.method(:include?)) }.keys
# => ["Addaptive Accessibility"]

答案 2 :(得分:1)

hash.keys.select {|k| !(array & hash[k]).empty?}
  • array & hash[k]是一个由arrayhash[k]共有的元素组成的数组。
  • 我们只关心这个“十字路口”是否为空([])。
  • 我们可以使用(array & hash[k]).any?,这更简单,前提是您从未拥有密钥falsenil,因为[nil, false].any? =>假。