Ruby 内部展平(数组的数组)

Ruby inner flatten (array of arrays)

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

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

也就是说,元素数组是 (1) 2 元素数组,或 (2) 2 元素数组数组。

我正在尝试找到一种优雅的方法来 "flatten" 这个数组,这样 (2) 的元素就会扩展到根级元素中。在这个例子中:

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

这与使用 Array#flatten(depth) 几乎相同,只是 depth 需要从内到外工作,而不是从外到内。

实际数组可能会变得非常大,因此出于性能原因,我不想在循环中将 (<<) 元素推入新数组。出于某种原因,我想不出如何使用 mapflattenflat_map 或其他更高效的 Enumerable 方法的任意组合来完成此操作而无需编写 C++ 样式预分配和填充循环。谁能想到一种更符合 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]]
]