从带有数组元素的哈希中,如何找到特定数组值的键?

时间:2018-10-10 04:28:30

标签: arrays ruby hash

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

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

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

这是一种方法:

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

还有其他最佳方法来处理吗?

5 个答案:

答案 0 :(得分:1)

tab_details.find { |_,v| v.include?("1") }&.first
  #=> "ex1"

tab_details.find { |_,v| v.include?("cat") }&.first
  #=> nil

&Safe Navigation Operator。在上面的第二个示例中,该块返回nil,因此,由于SNO的原因,first没有执行,并且返回了nil

答案 1 :(得分:1)

执行此操作的一种方法(不是那么直接)可以是通过扩展每个数组以反转散列以将每个元素设置为键:

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和数组元素属于相同类型,即整数。您可以根据需要转换它们。对您的问题的回答:

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

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

答案 2 :(得分:0)

您可以使用检测方法

 k, v = tab_details.detect{ |_,v| v.include?("1") }

 p k

答案 3 :(得分:0)

> tab_details = {"ex1"=>["1", "2"], "ex2"=>["3", "4", "5"], "ex3"=>["2", "1", "9"]}
> tab_details.select{|k,v| v.include? "1"}.keys
#=> ["ex1", "ex3"]

检查整数,使用map(&:to_i)

将数组元素转换为整数
> tab_details.select{|k,v| v.map(&:to_i).include? 1}.keys
#=> ["ex1", "ex3"]

如果同一元素可以位于多个数组中,请使用选择

答案 4 :(得分:0)

hash.key(value) => key

就您而言,

irb(main):012:0> tab_details.key(['1', '2']) => "ex1"