我有一个哈希数组(array1),如下所示:
array1 = [
{:ID=>"1", :value=>"abc"},
{:ID=>"2", :value=>"def"}
]
我可以遍历每个哈希并手动检查每个哈希值:
array1.each do |h|
if h.has_value?("def")
#do something
end
end
有没有办法检查哈希值" abc"存在于数组内的哈希内,而不必迭代数组?
答案 0 :(得分:2)
find
方法是数组最简洁的方法。
array1.find { |item| item[:value] == 'abc' }
无论如何,如果你可以直接使用哈希开始更好但是如果你必须从数组切换到哈希来进行O(1)查找,那么无论如何它都可能会更慢。
答案 1 :(得分:2)
使用any?
而不是每个,如果找到它会在早期阶段中断,最好的情况是O(1)和最坏情况O(n)
word = "def"
is_present = array1.any? { |h| h.has_value?(word) }
如果在散列中找到true
,则 is_present为word
,否则为false
答案 2 :(得分:1)
无论如何,您都可以避免迭代数组。这是一种方式。
array1.flat_map(&:values).include?("def")
#=> true
请注意
array1.flat_map(&:values)
#=> ["1", "abc", "2", "def"]
答案 3 :(得分:0)
你显然必须至少迭代一次数组元素。
如果经常这样做,您应该使用其他数据格式:
array1 = [
{ ID: '1', value: 'abc' },
{ ID: '2', value: 'def' },
{ ID: '3', value: 'abc' }
]
lookup_table = array1.each_with_object(Hash.new { |h, k| h[k] = [] }) do |hash, table|
table[hash[:value]] << hash[:ID]
end
p lookup_table
# {"abc"=>["1", "3"], "def"=>["2"]}
p lookup_table['abc']
# ["1", "3"]
作为奖励,它会为您提供找到此值的所有ID
个,并且可以快速提供。
如果您只是想知道哈希值中某处是否有值,可以使用Set
:
require 'set'
all_values = Set.new(array1.map{|h| h[:value]})
p all_values.include? 'abc'
# true
p all_values.include? 'xyz'
# false
同样,查找将比使用哈希数组快得多。