嵌套数组删除nil

时间:2014-01-21 08:47:48

标签: ruby arrays null

我有这样的嵌套数组:

['foo', [nil], 'baz', ['bar'], nil, ['zoo']]

优雅地删除nil但留下空数组?* 我希望看到:

['foo', [], 'baz', ['bar'], ['zoo']]

任何帮助大师?
*一次迭代

3 个答案:

答案 0 :(得分:4)

尝试代码:

array = ['foo', [nil], 'baz', ['bar'], nil, ['zoo']]
array.map! {|v| v.is_a?( Array ) && v.compact || v }.compact
# => ["foo", [], "baz", ["bar"], ["zoo"]] 

或更灵活:

array.map! {|v| v.respond_to?( :compact ) && v.compact || v }.compact
# => ["foo", [], "baz", ["bar"], ["zoo"]] 

或陷阱:

array.map! {|v| v.compact rescue v }.compact
# => ["foo", [], "baz", ["bar"], ["zoo"]] 

答案 1 :(得分:2)

我会这样做:

a = ['foo', [nil], 'baz', ['bar'], nil, ['zoo']]
a.map { |e| e.is_a?(Array) ? e.compact : e }.compact
# => ['foo', [], 'baz', ['bar'], ['zoo']]

更新:

a.map { |e| e.instance_of?(Array) ? e.compact : e }.compact

更干净instance_of?,如果对象是该确切类的实例而不是子类,则返回true

答案 2 :(得分:2)

这是一个递归版本,可以更深入地嵌套:

a =  ['foo', [nil, [nil, nil, [nil, 1, 2]]], 'baz', ['bar'], nil, ['zoo']]

def recursive_conpact(arr)
   arr.is_a?(Array) ? arr.compact.map{|x|recursive_conpact(x)} : arr
end

p recursive_conpact(a) #=> ["foo", [[[1, 2]]], "baz", ["bar"], ["zoo"]]