Ruby - 优雅地展平数组但不要忽略空子数组
Ruby - elegantly flatten an array but don't ignore empty sub-arrays
使用.flatten
是一个方便的小技巧,可以将一个子数组的数组变成一个数组。
例如:[[1,3],2,[5,8]].flatten
=> [1,3,2,5,8]
您甚至可以包含 nil [1,[2,nil],3].flatten
将导致 [1,2,nil,3]
.
这种方法在嵌套.map
方法的时候很有用,但是对于一个空的子数组怎么算呢?例如:[1,[2,3],[],4].flatten
会 return [1,2,3,4]
... 但是如果我需要跟踪空子数组怎么办,可能会将结果变成 [1,2,3,0,4]
或 [1,2,3,nil,4]
有什么优雅的方法可以做到这一点吗?或者我是否需要编写一些方法来遍历每个单独的子数组并一一检查?
首先将空数组映射到nil
s,然后展平
[1,2,[1,2,3],[]].map{|x| if x.is_a? Array and x.empty? then nil else x end}.flatten
如果不需要递归检查嵌套子数组:
[1,[2,3],[],4].map { |a| a == [] ? nil : a }.flatten
使用.flatten
是一个方便的小技巧,可以将一个子数组的数组变成一个数组。
例如:[[1,3],2,[5,8]].flatten
=> [1,3,2,5,8]
您甚至可以包含 nil [1,[2,nil],3].flatten
将导致 [1,2,nil,3]
.
这种方法在嵌套.map
方法的时候很有用,但是对于一个空的子数组怎么算呢?例如:[1,[2,3],[],4].flatten
会 return [1,2,3,4]
... 但是如果我需要跟踪空子数组怎么办,可能会将结果变成 [1,2,3,0,4]
或 [1,2,3,nil,4]
有什么优雅的方法可以做到这一点吗?或者我是否需要编写一些方法来遍历每个单独的子数组并一一检查?
首先将空数组映射到nil
s,然后展平
[1,2,[1,2,3],[]].map{|x| if x.is_a? Array and x.empty? then nil else x end}.flatten
如果不需要递归检查嵌套子数组:
[1,[2,3],[],4].map { |a| a == [] ? nil : a }.flatten