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

>> 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是否为这个问题提供了很好的解决方案?

有帮助吗?

解决方案

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

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

使用Ruby 1.8.6,您可以做到这一点:

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

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

# 1.8.7+:
a.collect &:compact

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

其他提示

如果您要使用 in_groups_of 你可以传递 false 作为第二个参数,它不会填写“空白”。 nil ,但真的没什么。

除非您想永久更改 a

a.map do |e|
  e.compact
end
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]]
a.each {|subarray| subarray.compact!}
a.compact!

应该工作......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top