2016-05-17 78 views
3

我有如下所示紅寶石內扁平化(數組的數組)

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

即,要麼(1)2-元件陣列元件的陣列,或(2)的數組的數組2元素陣列。

我想找到一個優雅的方式來「扁平化」這個數組,使得(2)中的元素被擴展到根級元素中。在這個例子中:

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

這幾乎就像使用Array#flatten(depth),除了depth需要由內而外的工作,而不是在外面

實際陣列可以得到非常大的,所以我不知道。由於性能原因,想要將(<<)元素推入循環中的新陣列。出於某種原因,我想不出如何使用map,flatten,flat_map或其他更高效的方法的任何組合來完成此操作,而無需編寫C++風格的預分配和填充循環。任何人都可以想到更多的Rubyist方法來做到這一點?

回答

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]] 
]