2016-09-07 5 views
4

私は次のような構造Rubyでサブアレイを平坦化する方法は?

a = [['a', 'b', 'c'], ['d', 'e', 'f'], [['g', 'h', 'i'], ['l', 'm', 'n']]] 

を持っていると私は、次を取得したい:

[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['l', 'm', 'n']] 

私は次のことを試してみた:

a.flatten => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'l', 'm', 'n'] 

a.flatten(1) => ['a', 'b', 'c', 'd', 'e', 'f', ['g', 'h', 'i'], ['l', 'm', 'n']] 

私が見つけた解決策を、今のところ初期の構造を次の形式に変更することです:

b = [[['a', 'b', 'c']], [['d', 'e', 'f']], [['g', 'h', 'i'], ['l', 'm', 'n']]] 

、その後

b.flatten(1) => [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['l', 'm', 'n']] 

を呼び出すが、私はaが構築された方法を変更することができただけので、私はこれを行うことができます。私の質問は残っています:aからの希望の結果を得るには?

+1

あなたは/トリプル(サイズ3の配列を)持っている必要があることがわかっている場合、私はあなたの質問に答えていない溶液で行く:)と '平らにしたいですスライスしてください。 – Felix

+0

いいえ、各配列内の要素数は固定されておらず、配列とサブアレイの数も – coorasse

答えて

6
a.each_with_object([]) do |e, memo| 
    e == e.flatten ? memo << e : e.each { |e| memo << e } 
end 
#⇒ [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['l', 'm', 'n']] 
+0

より洗練されたものを楽しみにしていますが、あなたのソリューションはうまく機能しています。 – coorasse

4

その他のソリューション:

a.flat_map { |e| e[0].is_a?(Array) ? e : [e] } 
#=> [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["l", "m", "n"]] 
+1

'a.flat_map {| e | e.flatten == e? [e]:e} 'も動作します – coorasse

+0

' Array#flat? 'はここでは非常に便利です。 – Stefan

+1

@coorasseは、すべての配列を変換する代わりに最初の要素をチェックしてから – Ilya

関連する問題