Ruby内部展平(数组数组)

我有一个像下面这样的数组

[ [[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需要从内到外工作,而不是外部工作。

实际的数组可能变得非常大,因此出于性能原因,我不希望将( << )元素推送到循环中的新数组中。 出于某种原因,我无法想到如何使用mapflattenflat_map或其他更有效的Enumerable方法的任意组合来实现这一点,而无需编写C ++样式的preallocate-and-populate循环。 任何人都可以想到更多Rubyist方式来做到这一点吗?

一种方法是:

 array.flatten.each_slice(2).to_a 

为后人发布另一个解决方案:

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