2016-05-17 10 views
3

Iは、(1)2素子アレイの要素の配列である、または(2)アレイ下記ルビー内側平坦化(配列の配列)

[ 
    [[0, :a], [2, :b]], 
    [3, :c], 
    [4, :d], 
    [[5, :e], [6, :f], [7, :g]] 
] 

ような配列を有します2要素アレイ。

私は、(2)の要素がルートレベルの要素に展開されるように、この配列を「平坦化」するためのエレガントな方法を見つけようとしています。この例では:

[[0, :a], [2, :b], [3, :c], [4, :d], [5, :e], [6, :f], [7, :g]] 

depthは、実際の配列が非常に大きくなる可能に裏返しではなく、外部から動作するように

を必要とするので、私はしません除いこれは、ほとんどArray#flatten(depth)を使用してのようなものです。パフォーマンス上の理由から、ループ内の新しい配列に(<<)要素をプッシュしたいとします。何らかの理由で、私はmapflatten、、または他のより効率的なEnumerableメソッドの組み合わせをどのように使用してC++スタイルのpreallocate-and-populateループを記述することなくこれを達成するか考えることはできません。誰でもこれを行うもっとRuby的な方法を考えることができますか?行うには

答えて

7

一つの方法は次のとおりです。

array.flatten.each_slice(2).to_a 
1

は、後世のために、ここで別の解決策を投稿:

array.flat_map{|el| el.first.is_a?(Array) ? el : [el]} 

最も内側の配列が可変長である場合は、このソリューションはまた、ハンドル - つまり、合計で配列は、(1)n要素配列の配列または(2)n要素配列の配列です(nは任意の要素に対して必ずしも同じではありません)。例えば、

[ 
    [1,2,3], 
    [[4,5], [6,7,8,9]] 
] 
関連する問題