2017-02-21 64 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