2017-02-21 28 views
0

使用.flatten是一个方便的小技巧,可以将一组子数组变成单个数组。 例如:[[1,3],2,[5,8]].flatten =>[1,3,2,5,8] 你甚至可以包括零[1,[2,nil],3].flatten将导致[1,2,nil,3]红宝石 - 优雅地铺平数组,但不要忽略空的子数组

这种方法在嵌套.map方法时非常有用,但是如何解释一个空的子数组呢?例如:[1,[2,3],[],4].flatten将返回[1,2,3,4] ...但如果我需要跟踪空的子排列,也许结果转换为[1,2,3,0,4][1,2,3,nil,4]

是否有任何优雅的方式来做到这一点?或者,我是否需要编写一些方法来遍历每个单独的子数组并逐个检查它?

+0

你需要检查嵌套空数组,即'[1,[2,3,[]],4]'? – eiko

回答

5

如果您不需要递归查询嵌套子排列:

[1,[2,3],[],4].map { |a| a == [] ? nil : a }.flatten 
+0

这比我有点干净。我将a == []更改为a.any?但类似的概念...出于某种原因,我总是忽略把逻辑放到我的.map块中。 – jkessluk

+1

@jkessluk不会a.any?呛在不是阵列的物品上? – eiko

+0

是的,但我在一个辅助方法中使用它,我已经确保通过的项目是一个数组。否则,是的。你是对的。 – jkessluk

1

一空数组映射到nil S,然后压平

[1,2,[1,2,3],[]].map{|x| if x.is_a? Array and x.empty? then nil else x end}.flatten