2013-06-20 21 views
19

Như chúng ta đều biết, Array#compact xóa nil yếu tố khỏi mảng.có tương đương với Array # compact cho các phần tử trống không?

array.reject { |element| element.empty? }

sẽ loại bỏ các yếu tố rỗng như [] (ở đường ray bạn cũng có thể làm #blank? để thoát khỏi phần tử rỗng nil yếu tố).

Có phương pháp viết tắt để xóa các phần tử trống/trống như Array#compact không? Hoặc đang sử dụng Array#reject đặt cược tốt nhất của tôi?

Tôi chưa thấy số trống "tương đương" #compact, nếu có. Nhưng có lẽ tôi chỉ nhìn nó.

Trả lời

25

Có!

array.reject &:empty? 

Tuy nhiên, như scarver2Hoang Le giải thích, điều này sẽ thất bại với một NoMethodError nếu mảng chứa nil.


Nếu bạn đang sử dụng Rails hoặc Active Support, bạn có thể yên tâm viết:

array.reject &:blank? 

Sẽ không có lỗi vì tất cả các đối tượng đáp ứng với blank?, including nil.

Ngoài ra còn có một cách khác để làm điều đó, theo đề nghị của mu is too short:

array.select &:present? 

Dường present? được thực hiện trong điều kiện của blank? nên cả hai đều thích hợp.

+7

Tôi cho rằng bạn cũng có thể 'array.select (&: present?)' Trong Rails nếu đọc tốt hơn. –

+0

Điểm tốt; vì một lý do nào đó tôi thường chỉ nghĩ đến việc sử dụng '&' khi tôi đang làm 'Array # map'. – gregates

+1

@muistooshort Ý tưởng tuyệt vời với 'select (&: present?)' Điều này sẽ trả về một mảng trống nếu tất cả các phần tử đều trống. Phương thức 'reject' đã trả về' nil' gây ra các phương thức kế tiếp như 'join' hoặc' map' thành thất bại. – scarver2

Các vấn đề liên quan