Как удалить пустые элементы из массива? - PullRequest
261 голосов
/ 04 мая 2011

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

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

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

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

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

Ответы [ 17 ]

472 голосов
/ 04 мая 2011

Есть много способов сделать это, один из них reject

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

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

158 голосов
/ 25 января 2013
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)

=> ["A", "B", "C"]
69 голосов
/ 17 января 2014

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

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

вывод:

[1, 2, "hello"]
52 голосов
/ 27 октября 2012

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

cities.delete("")
40 голосов
/ 04 июля 2013

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

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

Это удалит все пустые или нулевые элементы.

22 голосов
/ 29 июля 2015

Самые явные

cities.delete_if(&:blank?)

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

Например:

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

cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
21 голосов
/ 28 июля 2012

Попробуйте это:

puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
17 голосов
/ 04 мая 2011

Использование reject:

>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
14 голосов
/ 07 октября 2013
cities.reject! { |c| c.blank? }

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

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

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

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

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

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

10 голосов
/ 10 сентября 2012

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

 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...