要将数组分成两个相等的部分,我会这样做,
>> 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是否为这个问题提供了很好的解决方案?
答案 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!
应该工作......