Удалите нуль и пустую строку в массиве в Ruby
Я новичок в Ruby и придерживался этой проблемы. Скажем, у меня есть такой массив:
arr = [1, 2, 's', nil, '', 'd']
и я хочу удалить из него нуль и пустую строку, т.е. конечный массив должен быть:
arr = [1, 2, 's', 'd']
Я попробовал compact
, но он дает следующее:
arr.compact!
arr #=> [1, 2, 's', '', 'd'] doesn't remove empty string.
Мне было интересно, есть ли разумный способ сделать это в Ruby.
Ответы
Ответ 1
Вы можете сделать это:
arr.reject { |e| e.to_s.empty? } #=> [1, 2, "s", "d"]
Примечание nil.to_s => ''
.
Если arr
может содержать другой вид пустого объекта (например, массив или хэш), который вы хотите сохранить, измените e.to_s.empty?
на e.to_s == ''
Ответ 2
Поскольку вы хотите удалить как nil
, так и пустые строки, это не дубликат Как удалить пустые элементы из массива?
Вы хотите использовать .reject
:
arr = [1, 2, 's', nil, '', 'd']
arr.reject { |item| item.nil? || item == '' }
ПРИМЕЧАНИЕ: reject
с и без bang ведет себя так же, как compact
с и без bang: reject!
и compact!
изменять сам массив, а reject
и compact
верните копию массива и оставьте исходный текст неповрежденным.
Если вы используете Rails, вы также можете использовать blank?
. Он был специально разработан для работы с nil
, поэтому вызов метода становится:
arr.reject { |item| item.blank? }
Ответ 3
Я стараюсь:
arr = [1, 2, 's', nil, '', 'd']
arr.reject(&:blank?)
возвращает:
=> [1, 2, "s", "d"]
Ответ 4
Вы можете использовать compact с reject
arr = [1, 2, 's', nil, '', 'd']
arr = [1, 2, 's', 'd']
arr = arr.compact.reject { |h| h == "" }
или
arr = arr.compact.delete_if { |h| h == "" }
Ответ 5
Вы также можете использовать -
для удаления всех элементов nil
и ''
:
arr -= [nil, '']
#=> [1, 2, "s", "d"]
Демонстрация
Или compact
и reject
с ярлыком (если вы не используете Rails, где вы можете просто использовать arr.reject(&:blank?)
):
arr = arr.compact.reject(&''.method(:==))
#=> [1, 2, "s", "d"]
Демонстрация
Ответ 6
Вы можете использовать метод compact и delete_if для удаления нулевой и пустой строки в массиве в Ruby
arr = [1, 2, 's', nil, '', 'd']
arr.compact!.delete_if{|arrVal| arrVal.class == String and arrVal.empty?}
=> [1, 2, "s", "d"]
Ответ 7
Примечание. Я рассматриваю, что в массиве может быть строка с пробелами в ней.
Вы можете сделать:
arr = [1, 2, 's', nil, ' ', 'd']
arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '') == '') }
#=> [1, 2, "s", "d"]
или
arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '').empty?) }
#=> [1, 2, "s", "d"]
или если вы хотите обновить сам объект arr
, а затем:
arr.reject!{|a| a.nil? || (a.to_s.gsub(' ', '') == '') } # notice the ! mark, it'll update the object itself.
p arr #=> [1, 2, "s", "d"]
Ответ 8
попробуйте это:
[1, 2, "s", nil, "", "d"].compact.select{|i| !i.to_s.empty?}
Ответ 9
Надеюсь, это сработает для вашего дела:
arr = [1, 2, 's', nil, '', 'd']
arr.select{|x| x.to_s!="" }
Ответ 10
Я бы добавил .strip
, чтобы устранить потенциальные головные боли (предполагая, что это не приложение rails).
array = [1, 2, "s", nil, " ", "d", "\n"]
array.reject!{|a| a.nil? || (a.to_s.strip.empty?) }
#=> [1, 2, "s", "d"]
Ответ 11
arr.reject(&:blank?)
Просто используйте это, не нужно ничего другого.