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

Pat*_*ity 14 arrays recursion null ruby-on-rails

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

>> 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]]
Run Code Online (Sandbox Code Playgroud)

现在我有一个嵌套数组,如果数组的大小是奇数,则包含nil元素.如何从嵌套数组中删除nil元素?我想做点什么,

a.compact
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*oss 44

使用Ruby 1.8.7及更高版本,您可以执行以下操作:

a.each &:compact!
=> [[1, 2, 3], [4, 5]]
Run Code Online (Sandbox Code Playgroud)

使用Ruby 1.8.6,您可以做到这一点很长的路要走:

a.each {|s| s.compact!}
Run Code Online (Sandbox Code Playgroud)

这两个都将修改内容a.如果要返回一个新数组并保留原始数组,可以使用collect而不是each:

# 1.8.7+:
a.collect &:compact

# 1.8.6:
a.collect {|s| s.compact}
Run Code Online (Sandbox Code Playgroud)

  • 我认为&语法是在1.8.7中引入的 (3认同)

Rya*_*igg 8

如果您要使用in_groups_offalse,您可以将它作为第二个参数传递,它不会填充"空白" nil,但实际上没有.