【问题标题】:Find all keys in an array of hash with empty value查找具有空值的哈希数组中的所有键
【发布时间】:2016-10-08 03:53:45
【问题描述】:

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

hash.key(value) 只返回 1 个键...我可以使用 each/map 方法拆分散列或循环散列,但我不喜欢那种解决方案。

【问题讨论】:

  • 你可以在这里使用hash.select
  • 谢谢!这有帮助。选择后我调用键方法)

标签: ruby


【解决方案1】:

例子:

> 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]

【讨论】:

  • 你也可以输入v.nil? || v == ""而不是v.blank?
  • @joost :它在 Rails 中支持,而不是在普通 ruby​​ 中,并且有问题 rails 没有标记
【解决方案2】:

如果您打算获取与多个值相对应的键,您可以考虑构建一个提供该信息的散列。假设,例如,

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的值或空字符串,我们通过组合nil和""的值来获得h的空值键:

h[nil].concat h['']
  #=> [:pig, :bat, :cat, :owl]

关于(h[v] ||= []) &lt;&lt; k,如果h(最初为空)还没有密钥v,h[v] #=&gt; 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] = [] } 就会在h[k] &lt;&lt; k 之前执行。

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 2016-05-29
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多