我有一个包含键和值的散列,如下所示:
hash = {"lili" => [] , "john" => ["a", "b"], "andrew" => [], "megh" => ["b","e"]}
我们可以看到一些键的值为空数组。
一些键具有数组值,其中数组中有实际值。
我想遍历散列并生成一个新的散列,它只包含那些在数组中有值的键(而不是那些有空数组的键)。我该怎么做?
PRINT 仅密钥,但阅读您正在尝试生成给定哈希的哈希子集的帖子。
POST的TITLE的解决方案:
hash.each {|k,v| p k unless v.empty? }
如果要生成新的哈希子集,请提供原始哈希:
hash.reject { |k,v| v.nil? || v.empty? }
如果你想PRINT生成的子集给出原始哈希:
hash.reject { |k,v| v.nil? || v.empty? }.each { |k,v| p k }
您可以使用
reject
过滤掉散列中值为空数组或值为nil的那些元素,然后迭代打印它们的内容;
{:lili=>[], :john=>[:a, :b], :andrew=>[], :megh=>[:b, :e], :other=>nil}
.reject { (_2 || []).empty? }
.each { puts "#{_1} has the value(s) #{_2}" }
打印
john has the value(s) [:a, :b]
megh has the value(s) [:b, :e]
不确定您想要的输出或确切的数据结构,但您可以简单地使用
reject
和 empty?
删除任何包含空数组的 hash
值:
hash = {"lili" => [] , "john" => ["a", "b"], "andrew" => [], "megh" => ["b","e"]}
hash.reject {|k, v| v.empty?}
#=> {"john"=>["a", "b"], "megh"=>["b", "e"]}
然而,应该注意的是,如果任何哈希值是
nil
,这种方法将不起作用。为了解决这种情况,我建议在使用 compact
OR之前使用
reject
删除任何具有 nil 值的哈希元素,方法是测试 nil?
或 empty?
(并按此顺序):
hash = {"lili" => [] , "john" => ["a", "b"], "andrew" => [], "megh" => ["b","e"], "other" => nil}
hash.reject {|k, v| v.empty?}
#=> Evaluation Error: Ruby NoMethodError: undefined method `empty?' for nil:NilClass
hash.compact.reject {|k, v| v.empty?}
#=> {"john"=>["a", "b"], "megh"=>["b", "e"]}
hash.reject {|k, v| v.empty? or v.nil?}
#=> Evaluation Error: Ruby NoMethodError: undefined method `empty?' for nil:NilClass
hash.reject {|k, v| v.nil? or v.empty?}
#=> {"john"=>["a", "b"], "megh"=>["b", "e"]}
hash.reject {|k, v| v.empty? || v.nil?}
#=> Evaluation Error: Ruby NoMethodError: undefined method `empty?' for nil:NilClass
hash.reject {|k, v| v.nil? || v.empty?}
#=> {"john"=>["a", "b"], "megh"=>["b", "e"]}
返回一个仅包含包含或具有值(非空数组或非零值)的条目的哈希
我们可以简单地做..
hash.reject {|k,v| v.blank?}
这将返回 {"john"=>["a", "b"], "megh"=>["b", "e"]}