Ruby内部展平(数组数组)

时间:2016-05-17 18:21:47

标签: arrays ruby flatten

我有一个类似下面的数组

[
  [[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的方式呢?

2 个答案:

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