【问题标题】:Ruby inner flatten (array of arrays)Ruby 内部扁平化(数组数组)
【发布时间】:2016-09-13 23:54:45
【问题描述】:

我有一个类似下面的数组

[
  [[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++ 样式的预分配和填充循环。谁能想到一个更 Rubyist 的方式来做到这一点?

【问题讨论】:

    标签: arrays ruby flatten


    【解决方案1】:

    一种方法是:

    array.flatten.each_slice(2).to_a
    

    【讨论】:

      【解决方案2】:

      在这里为后代发布另一个解决方案:

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

      【讨论】:

        猜你喜欢
        • 2018-04-11
        • 1970-01-01
        • 1970-01-01
        • 2021-03-29
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        相关资源
        最近更新 更多