У меня есть следующий массив
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"]
Обратите внимание: это не работает с городом с пробелами