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
需要从内到外工作,而不是外部工作。
实际的数组可能变得非常大,因此出于性能原因,我不希望将( <<
)元素推送到循环中的新数组中。 出于某种原因,我无法想到如何使用map
, flatten
, flat_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]] ]