2017-02-21 8 views
0

.flattenを使用すると、サブ配列の配列を1つの配列に変換するのに便利です。 例:[[1,3],2,[5,8]].flatten =>[1,3,2,5,8] さらに[1,[2,nil],3].flattenを含めると、[1,2,nil,3]になります。Ruby - 配列をエレガントに平坦化しますが、空のサブ配列を無視しません

この種のメソッドは、.mapメソッドのネスト時に非常に便利ですが、空のサブアレイをどのように考慮しますか?たとえば:[1,[2,3],[],4].flatten[1,2,3,4]を返します...しかし、私は空のサブアレイを追跡する必要がある場合は、多分[1,2,3,0,4][1,2,3,nil,4]

に結果を有効にすると、これを行うための任意のエレガントな方法はありますか?または、個々のサブ配列を繰り返し処理し、それを1つ1つチェックするメソッドを記述する必要がありますか?

+0

は、ネストされた空をチェックする必要がありますか配列、すなわち '[1、[2、3、[]]、4]'? – eiko

答えて

5

を平らに、nil Sに空の配列をマッピング:

[1,[2,3],[],4].map { |a| a == [] ? nil : a }.flatten 
+0

これは私が持っていたものより少しきれいです。私は== []をa.anyに変更しましたか?しかし、同様のコンセプト...何らかの理由で、私は常に私の.mapブロックにロジックを置くことを見落としています。 – jkessluk

+1

@jkesslukはa.anyですか?配列ではない項目についてはチョーク? – eiko

+0

はい、私はヘルパーメソッドでこれを使用しています。ここでは、渡されたアイテムが配列であることがすでに保証されています。そうでなければ、はい。あなたは正しい。 – jkessluk

1

まずあなたが再帰的にネストされたサブアレイをチェックする必要がない場合、

[1,2,[1,2,3],[]].map{|x| if x.is_a? Array and x.empty? then nil else x end}.flatten 
関連する問題