RoR / Rubyはネストされた配列からnil要素を削除します
-
05-07-2019 - |
質問
配列を2つの等しい部分に分割するには、これを行います
>> 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要素のみを削除し、再帰的には削除しません。ルビーは、この問題に対して素晴らしい解決策を提供しますか?
解決
Ruby 1.8.7以降では、次のことができます。
a.each &:compact!
=> [[1, 2, 3], [4, 5]]
Ruby 1.8.6では、これを長い間行う必要があります。
a.each {|s| s.compact!}
これらは両方とも a
の内容を変更します。新しい配列を返し、元の配列をそのまま残したい場合は、 each
:
collect
を使用できます。
# 1.8.7+:
a.collect &:compact
# 1.8.6:
a.collect {|s| s.compact}
他のヒント
in_groups_of を使用する場合code>
2番目の引数として false
を渡すことができます。" blanks"は埋められません。 nil
を使用しますが、実際には何もありません。
永久に変更する場合を除き、 a
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