Відповіді:
Є багато способів зробити це, один є reject
noEmptyCities = cities.reject { |c| c.empty? }
Ви також можете використовувати reject!, що змінить citiesна місці. Він повернеться citiesяк повернене значення, якщо він щось відхилив, або nilякщо відхилень не буде зроблено. Це може бути хиткою, якщо ви не будете обережні (спасибі ninja08 за те, що вказали на це у коментарях).
cities.reject!(&:blank?)? empty?призначений для масивів
blank?доступний тільки через ActiveSupport. Стандартний Ruby використовує String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
rejectкраще, ніж reject!тому, що [].reject!(&:empty?)повертається nil, [].reject(&:empty?)повертається[]
Ось що для мене працює:
[1, "", 2, "hello", nil].reject(&:blank?)
вихід:
[1, 2, "hello"]
:blank?стосується Rails.
NoMethodError: undefined method empty? for nil:NilClass, :blank? краще ніж:empty?
:blankпрацює краще, ніж :empty. Тому :emptyщо не працює дляnil
Коли я хочу виправити такий масив, я використовую:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Це видалить усі порожні або нульові елементи.
cities.delete_if(&:blank?)
Це видалить і nilзначення, і значення порожнього string ( "").
Наприклад:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Спробуйте це:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Використання reject:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?).
nil.empty?бум-перерва!
reject(&:empty?)з , compactнаприклад[nil, ''].compact.reject(&:empty?)
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?.
Відповідей уже багато, але ось інший підхід, якщо ти в світі Рейки:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
present?походить від ActiveSupport. У ній немає тега Rails, і для цього потрібен додатковий дорогоцінний камінь для одного методу.
Ось ще один підхід для досягнення цього
ми можемо використовувати presenceзselect
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
" "моєму масиві були деякі елементи, які не були видалені методом відхилення. Вилучено ваш метод nil ""або " "елементи.
Найкоротший шлях cities.select(&:present?)
інший метод:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
Оновіть суворо з join&split
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
Результатом буде:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Зауважте, що це не працює з містом з пробілами
cities.reject!(&:empty?)