ROR / Ruby는 중첩 어레이에서 NIL 요소를 삭제합니다
-
05-07-2019 - |
문제
배열을 두 개의 동일한 조각으로 나누기 위해 나는 이것을 할 것입니다.
>> 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!
작동해야합니다 ....
제휴하지 않습니다 StackOverflow