ruby flatten和紧凑的数组充满了空数组

时间:2018-01-05 07:31:35

标签: arrays ruby flatten

在我的ruby项目中,我有一个数组数组,这是执行一些重图遍历的结果

示例:

[[], [1, 2, 3, 4, 5], [[], [], [[], [], [34, 54, 23, 45]]]]

我希望最终产品

[[1, 2, 3, 4, 5], [34, 54, 23, 45]]

flatten将离开我

[1, 2, 3, 4, 5, 34, 54, 23, 45]

所以我不想要

我被困了,可以使用一些帮助来解决这个问题

到目前为止,我已经

class Array
  def flatten_blanks
    each{ |elem| elem.flatten_blanks if elem.is_a?(Array) }
    reject!{ |elem| elem.is_a?(Array) && elem.length < 1 }
    self
  end
end

虽然很接近但却留下了类似

的内容
[[[[[[[1, 2, 3, 4, 5]]]]]]], [[[[[[[34, 54, 23, 45]]]]]]]

4 个答案:

答案 0 :(得分:9)

squeeze = -> (arr, acc = []) do
  case arr.compact.first
  when NilClass then acc
  when Array
    arr.reject(&:empty?).map { |e| squeeze.(e, acc) }.first
  else acc << arr
  end
end
squeeze.(arr)
#⇒ [[1, 2, 3, 4, 5], [34, 54, 23, 45]]

答案 1 :(得分:2)

对于你的例子,它可以解决问题:

ListView

它会产生:

array = [[], [1, 2, 3, 4, 5], [[], [], [[], [], [34, 54, 23, 45]]]]
array.map(&:flatten).delete_if(&:empty?)

答案 2 :(得分:2)

require 'json'

arr = [[], [1, 2, 3, 4, 5], [[], [], [[], [], [34, 54, 23, 45]]]]

JSON.parse("[#{arr.to_json.scan(/\[[^\[\]]+\]/).join(',')}]")
  #=> [[1, 2, 3, 4, 5], [34, 54, 23, 45]]

也可以使用递归方法(类似于mudsie的递归过程)。

def recurse(arr)
  arr.each_with_object([]) { |e,a|
    e.first.is_a?(Array) ? a.concat(recurse e) : a << e unless e.empty? }
end

recurse(arr)
  #=> [[1, 2, 3, 4, 5], [34, 54, 23, 45]]

答案 3 :(得分:0)

让我们调用您的数组arr

arr.map(&:flatten).reject(&:empty?)

为了解释一下,你在数组的元素而不是数组本身上展平,然后删除空的子数组。