Как удалить пустые элементы из массива?

У меня есть следующий массив

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]

Я хочу удалить пустые элементы из массива и хочу получить следующий результат:

cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

Есть ли какой-либо метод, например compact, который будет делать это без циклов?

Ответ 1

Существует много способов сделать это: reject

noEmptyCities = cities.reject { |c| c.empty? }

Вы также можете использовать reject!, который изменит cities на месте. Он либо вернет значение cities в качестве возвращаемого значения, если оно отклонит что-либо, либо nil, если не было сделано никаких отклонений. Это может быть получение, если вы не будете осторожны (спасибо ninja08 за то, что указали это в комментариях).

Ответ 2

1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)

=> ["A", "B", "C"]

Ответ 3

Вот что работает для меня:

[1, "", 2, "hello", nil].reject(&:blank?)

вывод:

[1, 2, "hello"]

Ответ 4

В моем проекте я использую delete:

cities.delete("")

Ответ 5

Когда я хочу убрать такой массив, я использую:

["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]

Это приведет к удалению всех элементов пустого или ноль.

Ответ 6

Попробуйте следующее:

puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]

Ответ 7

Наиболее явный

cities.delete_if(&:blank?)

Это приведет к удалению значений nil и значений пустой строки ("").

Например:

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]

cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

Ответ 8

Используйте reject:

>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

Ответ 9

cities.reject! { |c| c.blank? }

Причина, по которой вы хотите использовать blank? over empty?, состоит в том, что пустая строка распознает нулевые, пустые строки и пробелы. Например:

cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }

все равно вернется:

["Kathmandu", "Pokhara", "Dharan", "Butwal"]

И вызов empty? на " " вернет false, который вы, вероятно, хотите быть true.

Примечание: blank? доступен только через Rails, Ruby поддерживает только empty?.

Ответ 10

Уже есть много ответов, но вот еще один подход, если вы находитесь в мире Rails:

 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?

Ответ 11

Вот еще один подход для достижения этого

мы можем использовать presence с select

cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]

cities.select(&:presence)

["Kathmandu", "Pokhara", "Dharan", "Butwal"]

Ответ 12

Вот решение, если у вас смешанные типы в вашем массиве:

[nil,"some string here","",4,3,2]

Решение:

[nil,"some string here","",4,3,2].compact.reject{|r| r.empty? if r.class == String}

Вывод:

=> ["some string here", 4, 3, 2]

Ответ 13

Вы можете попробовать это

 cities.reject!(&:empty?)

Ответ 14

 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? } 

Ответ 15

Самый короткий путь cities.select(&:present?)

Ответ 16

другой метод:

> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]

Ответ 17

Обновление со строгим с join & split

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split

Результат будет:

["Kathmandu", "Pokhara", "Dharan", "Butwal"]

Обратите внимание: это не работает с городом с пробелами