我有一个类似下面的数组
[
[[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的方式呢?
答案 0 :(得分:8)
一种方法是:
array.flatten.each_slice(2).to_a
答案 1 :(得分: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]]
]