2015-07-20 2 views
0

Мой массив хэш подобен:Удалить значение ноль из массива хэш

[ 
    {: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} 
] 

Как я могу удалить nil значения, если в моей хэш id является nil?

+3

Пожалуйста, отредактируйте для уточнения (даже если вы выбрали ответ, так как многие люди могут прочитать ваш вопрос в будущем). «Как я могу удалить значение« nil », если мой хэш-идентификатор« nil »? Не имеет смысла. Вы можете удалить значения без удаления ключей. Возможно, вы хотите удалить все хэши« h », для которых' h [: id] .nil? # => true'? Если да, скажите так (и если ваш массив 'a', вы хотите изменить' a' или вернуть массив, равный 'a', с некоторым (хэшем) элементы удалены?), Будьте точны во всех вещах Ruby! –

ответ

4

Вы можете использовать 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

Или select:

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

Demo

0

Я предполагаю, что вы хотите, чтобы получить все хэши, значения которых не все nil. Вы можете сделать это:

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

Вы хотите использовать select method для фильтрации массива.

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

Если ваша проблема заключается в удалить элемент, который хэш id является nil то лучше использовать 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"} 
    ] 

Примечание:reject будет возвращает новый массив, содержащий элементы в self, для которого данный блок не является true. В то время как delete_if удаляет каждый элемент из self, для которого блок принимает значение true.

Смежные вопросы