문제

배열을 두 개의 동일한 조각으로 나누기 위해 나는 이것을 할 것입니다.

>> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
>> a.in_groups_of( (a.size/2.0).ceil ) if a.size > 0
=> [[1, 2, 3], [4, 5, nil]]

이제 배열의 크기가 홀수 인 경우 nil 요소가 포함 된 중첩 어레이가 있습니다. 중첩 어레이에서 NIL 요소를 제거하려면 어떻게해야합니까? 나는 같은 일을하고 싶다.

a.compact

그러나 불행히도 그것은 작동하지 않지만 Ruby는 첫 번째 레벨에서만 NIL 요소 만 제거하고 재귀 적으로는 제거하지 않습니다. 루비는이 문제에 대한 좋은 솔루션을 제공합니까?

도움이 되었습니까?

해결책

루비 1.8.7 이상으로 다음을 수행 할 수 있습니다.

a.each &:compact!
=> [[1, 2, 3], [4, 5]]

Ruby 1.8.6을 사용하면 먼 길을 사용했습니다.

a.each {|s| s.compact!}

이 두 가지 모두의 내용을 수정합니다 a. 새 배열을 반환하고 원본을 내버려두고 싶다면 사용할 수 있습니다. collect 대신에 each:

# 1.8.7+:
a.collect &:compact

# 1.8.6:
a.collect {|s| s.compact}

다른 팁

당신이 사용한다면 in_groups_of 당신은 그것을 통과 할 수 있습니다 false 두 번째 주장으로서 "공백"을 채우지 않을 것입니다. nil, 그러나 진정으로는 아무것도 없습니다.

영구적으로 변경하지 않는 한

a.map do |e|
  e.compact
end
arr_mixed=['hello', 2222, 'world', nil, [1, 2, 5, 'hi', nil],[1, 2, 3], [4,   5, nil]]

def compact_nested(array)
   arr2=[]
   array.each { |x|
   element = x.class==Array ? x.compact : x
   arr2<<element
   }
   arr2
end

p compact_nested(arr_mixed).compact #=>["hello", 2222, "world", [1, 2, 5, "hi"], [1, 2, 3], [4, 5]]
p arr_mixed #=>["hello", 2222, "world", nil, [1, 2, 5, "hi", nil], [1, 2, 3], [4, 5, nil]]
a.each {|subarray| subarray.compact!}
a.compact!

작동해야합니다 ....

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top