查找具有空值的哈希数组中的所有键

时间:2016-06-08 04:03:43

标签: ruby

如何查找具有空值或特定值的哈希数组中的所有键?

hash.key(value)只返回1个键...我可以使用每个/ map方法拆分哈希或循环哈希,但我不喜欢这个解决方案。

2 个答案:

答案 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] ||= []) << kv,那么

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] = [] }之前执行。