배열에서 빈 요소를 어떻게 제거합니까?


284

다음 배열이 있습니다

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]

배열에서 빈 요소를 제거하고 다음 결과를 원합니다.

cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

compact루프없이 수행 할 수 있는 방법이 있습니까?

답변:


501

이 작업을 수행하는 방법에는 여러 가지가 있습니다. reject

noEmptyCities = cities.reject { |c| c.empty? }

을 사용 reject!하면 cities제자리에서 수정 됩니다. cities무언가를 거부하거나 거부하지 않으면 반환 값으로 반환 됩니다 nil. 조심하지 않으면 문제가 될 수 있습니다 (댓글에서 지적한 ninja08 덕분에).


227
또는 더 컴팩트 한 것을 선호하는 경우cities.reject!(&:empty?)
aNoble

53
흠, 왜 안돼 cities.reject!(&:blank?)? empty?배열입니다
Nico

27
@Nico는를 blank?통해서만 이용할 수 있습니다 ActiveSupport. 표준 Ruby는 다음을 사용합니다 String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
Michael Kohl

24
reject더 나은보다 reject!때문에 [].reject!(&:empty?)반환 nil, [].reject(&:empty?)반환[]
konyak

17
거부와 조심!. 받지 않다! 배열을 변경하지 않으면 nil을 반환합니다. 변경 사항이 없을 때 배열을 반환하려면 뱅없이 거부를 사용하십시오.
Nick Res

164
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)

=> ["A", "B", "C"]

5
nil 값도 피하기 위해 .reject (& : blank?)를 사용하는 것이 좋습니다
ran632

4
@RanGalili blank?는 좋은 선택이지만 rails방법입니다.이 질문은 평범한 것입니다ruby
Swaps

83

여기 나를 위해 일하는 것이 있습니다 :

[1, "", 2, "hello", nil].reject(&:blank?)

산출:

[1, 2, "hello"]

Ruby 2.3.1에서 NoMethodError : "정의되지 않은 메소드`blank? ' for 1 : Fixnum "이 이것을 실행하려고합니다.
Tom

1
@ 톰 빈? Rails 전용 방법입니다. 일반 루비에 대한 배열에는 존재하지 않습니다. 비워야합니까? 또는 자신의 방법을 작성하십시오.
jpgeek 2019

@jpgeek 설명을 해주셔서 감사합니다. 제가 깨달았을 때의 어려움 :blank?은 Rails 전용입니다.
Tom

때문에 NoMethodError: undefined method empty? for nil:NilClass, :blank? 보다 더:empty?
레인

:blank보다 잘 작동합니다 :empty. :empty작동하지 않기 때문에nil
KBIIX

54

내 프로젝트에서는 다음을 사용합니다 delete.

cities.delete("")

5
우아한! 불행히도 나머지 배열을 반환하지 않지만 꽤 매끄 럽습니다.
Kevin

11
Array.delete는 직관적이지 않습니다. 그러한 메소드가 존재하면 .delete! ()처럼 작동합니다. .delete ()는 배열에서 파괴적인 방식으로 직접 작동합니다.
scarver2

41

이 배열을 정리하고 싶을 때 사용합니다.

["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]

이것은 모든 공백 또는 nil 요소를 제거합니다.


1
실제로 Tin Man의 대답은 Object # blank와 일치하는 것을 제거하므로 더 좋습니다. nil, "", "\ n", "", "\ n \ r"등 허용되는 답변과 달리 Rails 없이도 작동합니다.
superluminary

24

가장 명백한

cities.delete_if(&:blank?)

nil값과 빈 문자열 ( "") 값 이 모두 제거 됩니다.

예를 들면 다음과 같습니다.

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]

cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

문장 부호를 제거하고 콜론을 추가하면 "도시 : 공백 인 경우 삭제"가 표시됩니다. : D
clapp

2
blank는 루비 또는 레일 방법입니까?
Arnold Roa

2
@ArnoldRoa Rails 방식입니다.
PaulMest

1
빈 문자열 사이에 공백이 있으면 어떻게합니까?
Steven Aguilar 5

@StevenAguilar는 공백이 길이 1로 간주됩니다 (공백이 문자이므로). "".blank? => 거짓
phlegx

23

이 시도:

puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]

4
이것은 매끄럽고 ""를 반환하지 않습니다! 이것은 훌륭한 릴 트릭입니다.
Sean Larkin

2
[ "카트만두", "포카라", "", "다란", "버트 왈"]-[ ""]-이 경우 작동하지 않습니다
ajahongir

2.0.0-p247 : 001> [ "카트만두", "포카라", "", "다란", "버트 왈"]-[ ""] => [ "카트만두", "포카라", "다란", "버트 왈 "] 나를 위해 일하는 것 같습니다. 왜 작동하지 않는다고 생각합니까?
Raels

1
@Raels,이 경우 빈 문자열은 비어 있지 않습니다. 그 안에 하나의 공간이 있습니다.
Chandranshu

1
@Chandranshu 나는 다르게 간청했다. 텍스트를 편집기에 복사하여 붙여 넣었으며 제안한대로 따옴표 사이에 공백이 없음을 발견했습니다. 있다면, "" "를 빼면" "]가 작동합니다. superluminary의 예는 비슷하며 잘 작동합니다. 원래 요청은 "공백 요소"가 아닌 "공백 요소"를 제거하고, 빈 요소의 예를 OP에서 ""로 표시했습니다.
Raels

17

사용 reject:

>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

13
또는 위에서 언급 한 귀족처럼 reject(&:empty?).
mu는

proc에 대한 기호는 블록 형식보다 1.8.7에서 느립니다. 1.9.2에서 본 것과는 차이가 있습니다.
Caley Woods

Object # empty?와 일치하는 요소를 제거하므로 좋습니다. "\ n", "", nil, "\ n \ n \ n"등
초 고광도

5
nil.empty?붐 브레이크!
Naveed

1
배열이 전무 요소가있는 경우 @AllenMaxwell @Naveed이 앞서는 reject(&:empty?)compact[nil, ''].compact.reject(&:empty?)
scarver2

14
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를 통해서만 액세스 할 수 있습니다 empty?. Ruby 만 지원합니다 .


11

이미 많은 답변이 있지만 Rails 세계에 있다면 다른 접근법이 있습니다.

 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?

4
present?에서 온다 ActiveSupport. 이것은 Rails 태그가 없으며 한 가지 방법으로 여분의 보석이 필요합니다.
Michael Kohl

1
@Naveed, "RoR을 사용하는 경우"로 시작해야합니다. 초보자에게는 여전히 유용한 정보이기 때문에 공감하지 않을 것입니다.
pixelearth

9

이것을 달성하기위한 또 다른 접근법이 있습니다.

우리는 presence함께 사용할 수 있습니다select

cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]

cities.select(&:presence)

["Kathmandu", "Pokhara", "Dharan", "Butwal"]

2
감사합니다. " "배열에 거부 메소드로 제거되지 않은 일부 요소가 있습니다. 방법이 제거 nil ""되었거나 " "항목이 있습니다.
iamse7en

8

배열에 혼합 유형이있는 경우 해결책은 다음과 같습니다.

[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]

5

당신은 이것을 시도 할 수 있습니다

 cities.reject!(&:empty?)

3
아마 u 의미cities.reject!(&:blank?)
xguox

2
 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? } 

삭제 및 정리는 비용이 많이 드는 작업 일 것입니다.
Naveed


0

다른 방법 :

> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]

-2

join& 로 엄격한 업데이트split

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split

결과는 다음과 같습니다.

["Kathmandu", "Pokhara", "Dharan", "Butwal"]

참고 : 공백이있는 도시에서는 작동하지 않습니다.


2
매우 위험 해 보인다!
msdundar 2016 년

1
"New York"또는 "Naujoji Akmene"와 같은 도시가있는 경우이 기능이 실패합니다.
Petras L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.