【发布时间】:2016-10-08 03:53:45
【问题描述】:
如何在哈希数组中找到具有空值或特定值的所有键?
hash.key(value) 只返回 1 个键...我可以使用 each/map 方法拆分散列或循环散列,但我不喜欢那种解决方案。
【问题讨论】:
-
你可以在这里使用
hash.select -
谢谢!这有帮助。选择后我调用键方法)
标签: ruby
如何在哈希数组中找到具有空值或特定值的所有键?
hash.key(value) 只返回 1 个键...我可以使用 each/map 方法拆分散列或循环散列,但我不喜欢那种解决方案。
【问题讨论】:
hash.select
标签: ruby
例子:
> 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?
rails 没有标记
如果您打算获取与多个值相对应的键,您可以考虑构建一个提供该信息的散列。假设,例如,
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] ||= []) << k,如果h(最初为空)还没有密钥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] = [] } 就会在h[k] << k 之前执行。
【讨论】: