2011-09-30 8 views
1

루비의 배열에서 후행 공백 및 nil 값을 제거하는 방법.루비의 배열에서 후행 빈 값 제거

"컴팩트"기능은 필자의 요구 사항을 충족시키지 못합니다. 그것은 배열에서 모든 'nil'값을 제거합니다. 하지만 후행 빈 값과 nil 값만 제거하려고합니다. 이에 나에게 어떤 제안을주십시오 .. 당신은 단지 몇 nil의 빈 문자열 뒤에있는 경우

+0

당신이 비어 전무 후행 한 것은 무엇을 일으키는

또 다른 방법은 당신이 차단하지 않을 먼저 거꾸로 배열을 검사하는 것입니다 배열의 값? 문자열을 분할 한 결과입니까? –

답변

2
['a', "", nil].compact.reject(&:empty?) => ["a"] 
10

이 그것을 할 것이며, 잘해야한다 : 예를 들어

a.pop while a.last.to_s.empty? 

:

>> a = ["where", "is", nil, "pancakes", nil, "house?", nil, '', nil, nil] 
=> ["where", "is", nil, "pancakes", nil, "house?", nil, "", nil, nil] 
>> a.pop while a.last.to_s.empty? 
=> nil 
>> a 
=> ["where", "is", nil, "pancakes", nil, "house?"] 

.to_s.empty? 비트는 빈 문자열로 nil를 캐스팅 단지 quick'n'dirty 방법입니다 그래서 두 nil d ''은 단일 조건으로 처리 할 수 ​​있습니다. 예를 들어

n = a.length.downto(0).find { |i| !a[i].nil? && !a[i].empty? } 
a.slice!(n + 1, a.length - n - 1) if(n && n != a.length - 1) 

:

>> a = ["where", "is", nil, "pancakes", nil, "house?", nil, '', nil, nil] 
=> ["where", "is", nil, "pancakes", nil, "house?", nil, "", nil, nil] 
>> n = a.length.downto(0).find { |i| !a[i].nil? && !a[i].empty? } 
=> 5 
>> a.slice!(n + 1, a.length - n - 1) if(n && n != a.length - 1) 
=> [nil, "", nil, nil] 
>> a 
=> ["where", "is", nil, "pancakes", nil, "house?"] 
+0

아주 좋은 해결책입니다. – derp