哈希的每个值都是一个数组:
tab_details = {
'ex1' => ['1', '2']
}
我想传递一个元素并获取与具有该元素的数组相对应的键。
这是一种方法:
tab_details.each{|k, v|
return key = k if tab_details[k].include? '1'
}
还有其他最佳方法来处理吗?
答案 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"