2009-11-25 55 views
14

零元素要分割陣列分成相等的兩片,我會做這個,回報率/紅寶石刪除嵌套數組

>> a = [1,2,3,4,5] 
=> [1, 2, 3, 4, 5] 
>> a.in_groups_of((a.size/2.0).ceil) if a.size > 0 
=> [[1, 2, 3], [4, 5, nil]] 

現在,我已經有了一個包含零元素嵌套數組如果數組的大小很奇怪。我怎樣才能從嵌套數組中刪除nil元素?我想這樣做,

a.compact 

但不幸的是這不起作用,紅寶石僅刪除第一級零元素,而不是遞歸。紅寶石是否爲這個問題提供了很好的解決方案?

回答

44

使用Ruby 1.8.7及以後你可以做到以下幾點:

a.each &:compact! 
=> [[1, 2, 3], [4, 5]] 

隨着Ruby 1.8.6,你需要做很長的路要走:

a.each {|s| s.compact!} 

這兩個都會修改a的內容。如果你想返回一個新的數組並保持原來的孤單,你可以用collect代替each

# 1.8.7+: 
a.collect &:compact 

# 1.8.6: 
a.collect {|s| s.compact} 
+3

我認爲&語法是在1.8.7 – EmFi 2009-11-25 23:57:24

+1

@EmFi中引入的好點 - 我忘記了1.8.7。我會編輯我的答案。 – 2009-11-26 00:01:48

+0

您也可以使用'a.map(&:compact)' – Bongs 2014-07-15 17:09:04

-3
a.each {|subarray| subarray.compact!} 
a.compact! 

應該工作....

+2

可能不值得necro發佈,但這兩行應該是相反的順序。如果我們假設'a'具有'nil',那麼我們應該首先緊湊',否則我們將在塊內獲得無錯誤。 – NIA 2013-02-04 19:12:02

3

除非你想永久改變一個

a.map do |e| 
    e.compact 
end 
8

如果你使用in_groups_of你可以通過它false作爲第二個參數,它不會填寫在與nil「空白」,但真正沒有。

0
arr_mixed=['hello', 2222, 'world', nil, [1, 2, 5, 'hi', nil],[1, 2, 3], [4, 5, nil]] 

def compact_nested(array) 
    arr2=[] 
    array.each { |x| 
    element = x.class==Array ? x.compact : x 
    arr2<<element 
    } 
    arr2 
end 

p compact_nested(arr_mixed).compact #=>["hello", 2222, "world", [1, 2, 5, "hi"], [1, 2, 3], [4, 5]] 
p arr_mixed #=>["hello", 2222, "world", nil, [1, 2, 5, "hi", nil], [1, 2, 3], [4, 5, nil]]