Neha
Neha

Reputation: 305

Remove nil value from array of hash

My array of hash is like:

[
  {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!107", :name=>"Folder 11", :type=>"folder"},
  {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!105", :name=>"Pictures", :type=>"album"}, 
  {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!113", :name=>"Public", :type=>"folder"}, 
  {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!124", :name=>"sasd", :type=>"folder"}, 
  {:id=>nil, :name=>nil, :type=>nil}, 
  {:id=>nil, :name=>nil, :type=>nil},
  {:id=>nil, :name=>nil, :type=>nil},
  {:id=>nil, :name=>nil, :type=>nil}, 
  {:id=>nil, :name=>nil, :type=>nil}, 
  {:id=>nil, :name=>nil, :type=>nil}, 
  {:id=>nil, :name=>nil, :type=>nil}
]

How can I remove nil values if in my hash id is nil?

Upvotes: 0

Views: 2165

Answers (4)

potashin
potashin

Reputation: 44601

You can use reject:

arr.reject{|h| h[:id].nil?}

=> [{:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!107", :name=>"Folder 11", :type=>"folder"},
    {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!105", :name=>"Pictures", :type=>"album"},
    {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!113", :name=>"Public", :type=>"folder"},
    {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!124", :name=>"sasd", :type=>"folder"}]

Demo

Or select:

arr.select { |h| h[:id] }

Demo

Upvotes: 5

Gagan Gami
Gagan Gami

Reputation: 10251

If your concern is to remove element which hash id is nil then better to use delete_if

array.delete_if { |h| h[:id].nil? }
 => [
      {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!107", :name=>"Folder 11", :type=>"folder"}, 
      {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!105", :name=>"Pictures", :type=>"album"},
      {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!113", :name=>"Public", :type=>"folder"}, 
      {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!124", :name=>"sasd", :type=>"folder"}
    ]

Note: reject will returns a new array containing the items in self for which the given block is not true. While delete_if will Deletes every element of self for which block evaluates to true.

Upvotes: 1

Travis
Travis

Reputation: 5071

You want to use the select method to filter the array.

list = list.select { |item| item[:id] != nil }

Upvotes: 0

shivam
shivam

Reputation: 16506

I assume you want to get all hashes whose values are not all nil. You can do that by:

arr = [{:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!107", :name=>"Folder 11", :type=>"folder"}, {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!105", :name=>"Pictures", :type=>"album"}, {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!113", :name=>"Public", :type=>"folder"}, {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!124", :name=>"sasd", :type=>"folder"}, {:id=>nil, :name=>nil, :type=>nil}, {:id=>nil, :name=>nil, :type=>nil}, {:id=>nil, :name=>nil, :type=>nil}, {:id=>nil, :name=>nil, :type=>nil}, {:id=>nil, :name=>nil, :type=>nil}, {:id=>nil, :name=>nil, :type=>nil}, {:id=>nil, :name=>nil, :type=>nil}]

arr.find_all { |h| !h.values.compact.empty? }
# => [{:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!107", :name=>"Folder 11", :type=>"folder"}, {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!105", :name=>"Pictures", :type=>"album"}, {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!113", :name=>"Public", :type=>"folder"}, {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!124", :name=>"sasd", :type=>"folder"}]

Upvotes: 0

Related Questions