ruby 如何只打印有值的键?

yftpprvb  于 2022-12-29  发布在  Ruby
关注(0)|答案(3)|浏览(89)

我有一个包含键和值的散列,如下所示:

hash = {"lili" => [] , "john" => ["a", "b"], "andrew" => [], "megh" => ["b","e"]}

正如我们所看到的,一些键的值是空数组。
某些键具有数组值,其中数组 * 中 * 有实际值。
我想遍历哈希值并生成一个新的哈希值,它只包含数组中有值的键(而不是空数组),我该怎么做呢?

uqzxnwby

uqzxnwby1#

您可以使用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]
to94eoyn

to94eoyn2#

不确定所需的输出或确切的数据结构,但可以简单地将rejectempty?沿着使用,以删除任何包含空数组的hash值:

hash = {"lili" => [] , "john" => ["a", "b"], "andrew" => [], "megh" => ["b","e"]}

hash.reject {|k, v| v.empty?}
#=>  {"john"=>["a", "b"], "megh"=>["b", "e"]}

然而,需要注意的是,如果任何哈希值是nil,这种方法将不起作用。为了解决这种情况,我建议在使用rejectOR之前,使用compact删除任何具有空值的哈希元素,方法是测试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"]}
b4wnujal

b4wnujal3#

标题说:

PRINT只打印键,但阅读帖子时,您尝试生成给定哈希的哈希子集。
POSTTITLE的解决方案:

hash.each {|k,v| p k unless v.empty? }

如果你想生成一个新的哈希子集,请给予原始哈希:

hash.reject { |k,v| v.nil? || v.empty? }

如果您想打印生成的子集给予原始散列:

hash.reject { |k,v| v.nil? || v.empty? }.each { |k,v| p k }

相关问题