Подтвердить что ты не робот

Удалите нуль и пустую строку в массиве в 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.

4b9b3361

Ответ 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?)

Просто используйте это, не нужно ничего другого.