Câu trả lời:
Có nhiều cách để làm điều này, một là reject
noEmptyCities = cities.reject { |c| c.empty? }
Bạn cũng có thể sử dụng reject!
, sẽ sửa đổi cities
tại chỗ. Nó sẽ trả về cities
như giá trị trả về của nó nếu nó từ chối một cái gì đó, hoặc nil
nếu không có từ chối nào được thực hiện. Đó có thể là một vấn đề nếu bạn không cẩn thận (cảm ơn ninja08 vì đã chỉ ra điều này trong các bình luận).
cities.reject!(&:blank?)
? empty?
dành cho mảng
blank?
chỉ có sẵn thông qua ActiveSupport
. Ruby tiêu chuẩn sử dụng String#empty?
: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
reject
tốt hơn là reject!
vì [].reject!(&:empty?)
trả lại nil
, [].reject(&:empty?)
trả lại[]
Đây là những gì làm việc cho tôi:
[1, "", 2, "hello", nil].reject(&:blank?)
đầu ra:
[1, 2, "hello"]
:blank?
là Rails-cụ thể.
NoMethodError: undefined method empty? for nil:NilClass
, :blank?
tốt hơn:empty?
:blank
hoạt động tốt hơn so với :empty
. Bởi vì :empty
không hoạt động chonil
Trong dự án của tôi, tôi sử dụng delete
:
cities.delete("")
Khi tôi muốn dọn dẹp một mảng như thế này, tôi sử dụng:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Điều này sẽ loại bỏ tất cả các yếu tố trống hoặc không.
cities.delete_if(&:blank?)
Điều này sẽ loại bỏ cả nil
giá trị và giá trị chuỗi rỗng ( ""
).
Ví dụ:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Thử cái này:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Sử dụng reject
:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?)
.
nil.empty?
phá vỡ booom!
reject(&:empty?)
với compact
ví dụ[nil, ''].compact.reject(&:empty?)
cities.reject! { |c| c.blank? }
Lý do bạn muốn sử dụng blank?
trên empty?
là trống mà công nhận con số không, chuỗi rỗng và khoảng trắng. Ví dụ:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
vẫn sẽ trở lại:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Và gọi empty?
vào " "
sẽ trở lại false
, mà bạn có thể muốn được true
.
Lưu ý: blank?
chỉ có thể truy cập thông qua Rails, Ruby chỉ hỗ trợ empty?
.
Đã có rất nhiều câu trả lời nhưng đây là một cách tiếp cận khác nếu bạn ở trong thế giới Rails:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
present?
xuất phát từ ActiveSupport
. Điều này không có thẻ Rails và yêu cầu thêm đá quý cho một phương thức có vẻ quá mức.
Đây là một cách tiếp cận để đạt được điều này
chúng ta có thể sử dụng presence
vớiselect
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
" "
phần tử trong mảng không bị loại bỏ bằng phương thức từ chối. Phương pháp của bạn loại bỏ nil
""
hoặc " "
các mục.
Con đường ngắn nhất cities.select(&:present?)
Cập nhật nghiêm ngặt với join
&split
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
Kết quả sẽ là:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Lưu ý rằng: điều này không hoạt động với một thành phố có không gian
cities.reject!(&:empty?)