Reputation: 305
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
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"}]
Or select
:
arr.select { |h| h[:id] }
Upvotes: 5
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
Reputation: 5071
You want to use the select method to filter the array.
list = list.select { |item| item[:id] != nil }
Upvotes: 0
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