如何查找具有空值或特定值的哈希数组中的所有键?
hash.key(value
)只返回1个键...我可以使用每个/ map方法拆分哈希或循环哈希,但我不喜欢这个解决方案。
答案 0 :(得分:3)
示例:
> hash = {:a => 1, :b =>nil, :c =>4, :d => "", :e => 5}
> selected_values = [1,4,5]
> hash.select{|_,v| v.nil? || v == ""}.keys
#=> [:b, :d]
解决方案1:
> hash.select{|k,v| selected_values.include?(v)}.keys
#=> [:a, :c, :e]
解决方案2:
> matcher = ->(key,value) { selected_values.include?(value) }
> hash.select(&matcher).keys
#=> [:a, :c, :e]
答案 1 :(得分:0)
如果您打算获取与多个值对应的键,您可以考虑构建一个提供该信息的哈希。例如,假设
g = { :dog=>"gone", :cat=>"", :pig=>nil, :owl=>"", :bat=>nil, :ant=>"gone" }
然后构建
h = g.each_with_object({}) { |(k,v),h| (h[v] ||= []) << k }
#=> {"gone"=>[:dog, :ant], ""=>[:cat, :owl], nil=>[:pig, :bat]}
现在,要获取具有特定值的密钥,例如"gone"
,我们只需检索"gone"
的值:
h["gone"]
#=> [:dog, :ant]
如果empty
表示nil
或空字符串的值,我们会通过组合h
和{的值来获取nil
具有空值的键{1}}:
""
关于h[nil].concat h['']
#=> [:pig, :bat, :cat, :owl]
,如果h(最初为空)还没有密钥(h[v] ||= []) << k
,v
,那么
h[v] #=> nil
或者,可以写
(h[v] ||= []) << k
#=> (h[v] = h[v] || []) << k
# (h[v] = nil || []) << k
# (h[v] = []) << k
# h[v] = [k]
每当块变量h = g.each_with_object(Hash.new { |h,k| h[k] = [] }) { |(k,v),h| h[v] << k }
表示的(最初为空)哈希没有键h
时,块k
就会在{ |h,k| h[k] = [] }
之前执行。