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
需要从内到外工作,而不是从外到内。
实际数组可能会变得非常大,因此出于性能原因,我不想在循环中将 (<<
) 元素推入新数组。出于某种原因,我想不出如何使用 map
、flatten
、flat_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]]
]
我有一个像下面这样的数组
[
[[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
需要从内到外工作,而不是从外到内。
实际数组可能会变得非常大,因此出于性能原因,我不想在循环中将 (<<
) 元素推入新数组。出于某种原因,我想不出如何使用 map
、flatten
、flat_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]]
]