首页 > 解决方案 > 从包含数组元素的哈希中,如何找到特定数组值的键?

问题描述

我的哈希的每个值都是一个数组:

tab_details = {
  'ex1' => ['1', '2']
}

我想传递一个元素并获取与具有该元素的数组对应的键。

这是这样做的一种方法:

tab_details.each{|k, v|
  return key = k if tab_details[k].include? '1'
}

有没有其他最佳方法来处理这个问题?

标签: arraysrubyhash

解决方案


一种(不那么直接)的方法是通过扩展每个数组以使每个元素成为键来反转哈希:

tab_details = {
  'foo' => [2, 3, 5],
  'bar' => [1, 4, 6]
}
# => {"foo"=>[2, 3, 5], "bar"=>[1, 4, 6]}

inverted_hash = tab_details.each_with_object({}) do |(k, ary), out|
                  ary.each { |elem| out[elem] = k }
                end
# => {2=>"foo", 3=>"foo", 5=>"foo", 1=>"bar", 4=>"bar", 6=>"bar"}

input = 1
inverted_hash[input]
# => "bar"

现在,当然,它假定input和 数组元素的类型相同,即整数。您可以将它们转换为 acc。对于您的问题中给出的内容:

# If all the array elements are strings
inverted_hash[input.to_s]
# => "bar"

它做出的另一个假设是,多个数组中不存在任何元素。


推荐阅读