如何只打印有值的键?

问题描述 投票:0回答:4

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

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

我们可以看到一些键的值为空数组。

一些键具有数组值,其中数组中有实际值

我想遍历散列并生成一个新的散列,它只包含那些在数组中有值的键(而不是那些有空数组的键)。我该怎么做?

ruby hash hashmap
4个回答
1
投票

标题说:

PRINT 仅密钥,但阅读您正在尝试生成给定哈希的哈希子集的帖子。

POSTTITLE的解决方案:

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 }

0
投票

您可以使用

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]

0
投票

不确定您想要的输出或确切的数据结构,但您可以简单地使用

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

0
投票

返回一个仅包含包含或具有值(非空数组或非零值)的条目的哈希

我们可以简单地做..

hash.reject {|k,v| v.blank?}

这将返回 {"john"=>["a", "b"], "megh"=>["b", "e"]}

© www.soinside.com 2019 - 2024. All rights reserved.