在我的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]]]]]]]
答案 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?)
为了解释一下,你在数组的元素而不是数组本身上展平,然后删除空的子数组。