RoR / Ruby从嵌套数组中删除nil元素

时间:2009-11-25 23:33:57

标签: ruby-on-rails arrays recursion null

要将数组分成两个相等的部分,我会这样做,

>> 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元素的嵌套数组,如果数组的大小是奇数。如何从嵌套数组中删除nil元素?我想做点什么,

a.compact

但不幸的是,这不起作用,ruby只删除第一级的nil元素而不是递归。 ruby是否为这个问题提供了很好的解决方案?

5 个答案:

答案 0 :(得分: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}

答案 1 :(得分:8)

如果你使用in_groups_of,你可以将false作为第二个参数传递,它不会填充nil的“空白”,但实际上没有。

答案 2 :(得分:3)

除非您想永久更改 a

a.map do |e|
  e.compact
end

答案 3 :(得分: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]]

答案 4 :(得分:-3)

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

应该工作......