2016-05-17 79 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]] 
]