Ruby中二维数组是否存在类似compact的空元素移除方法?
Ruby二维数组移除全nil子数组的实现方法
Ruby原生的Array#compact仅能移除数组顶层的nil元素,无法自动识别并移除内部所有元素均为nil的子数组,你需要的场景没有内置的直接方法,但可以通过简单的数组操作实现需求。
最简实现方式
直接使用reject加全量nil判断即可,代码如下:
# 移除所有元素全为nil的子数组 [[nil, nil], ["Prestation Standard", 1]].reject { |sub_arr| sub_arr.all?(&:nil?) } # => [["Prestation Standard", 1]]
封装为自定义方法(可选)
如果需要频繁使用这个功能,可以给Array类扩展自定义方法,后续可以像调用compact一样直接使用:
class Array # 移除数组中所有元素全为nil的子数组 def compact_full_nil_sub reject do |item| # 仅处理数组类型的元素,非数组元素正常保留 item.is_a?(Array) && item.all?(&:nil?) end end end # 调用示例 [[nil, nil], ["Prestation Standard", 1], nil, "测试字符串"].compact_full_nil_sub # => [["Prestation Standard", 1], nil, "测试字符串"]
扩展场景:同时清理子数组内部nil
如果你的使用场景里需要先把子数组内的nil清理掉,再移除空的子数组,可以组合使用compact和过滤逻辑:
[[nil, "a", nil], [nil, nil], ["b", 1]].map(&:compact).reject(&:empty?) # => [["a"], ["b", 1]]
内容的提问来源于stack exchange,提问作者孙悟空
相关产品推荐
相关产品推荐

