Відповіді:
Є багато способів зробити це, один є 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?)