Home > Mobile >  How to print only the keys which have values?
How to print only the keys which have values?

Time:12-28

I have a hash with keys and values as follows:

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

As we can see some of the keys have values as empty arrays.

Some keys have array values where there are actual values in the array.

I want to loop over the hash and generate a new hash that includes only those keys which have values in their arrays (not the ones which have empty arrays). How can I do that?

CodePudding user response:

You could use reject to filter out those elements in your hash where the value is an empty array or the value is nil and then iterate to print their content;

{:lili=>[], :john=>[:a, :b], :andrew=>[], :megh=>[:b, :e], :other=>nil}
  .reject { (_2 || []).empty? }
  .each { puts "#{_1} has the value(s) #{_2}" }

that prints

john has the value(s) [:a, :b]
megh has the value(s) [:b, :e]

CodePudding user response:

Unsure of your desired output or exact data structure, but you can simply use reject along with empty? to remove any hash value that contains an empty array:

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

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

It should however be noted that this approach will not work if any hash values are nil. To address that situation, I would recommend either using compact to remove any hash elements with nil values prior to using reject OR by testing for either nil? or empty? (and in that order):

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