Методы массивов, удаляющих nil
элементов называется compact. Однако этого недостаточно для этой ситуации, потому что у вас есть массив массивов. Кроме того, вы захотите, чтобы select не-nil-массивы, или reject массивы, которые являются nil
. Вы можете легко объединить два следующим образом:
[[nil, nil], [1, 2], [nil, nil], [nil, nil]].reject { |arr| arr.compact.empty? }
Это будет работать только если у вас есть вложенные массивы чисел или nil
с. Если ваши вспомогательные массивы содержат как, например, [1, nil, 2]
, тогда это решение будет поддерживать весь вспомогательный массив.
Модифицировать вспомогательный массив можно, удаляя nil
, в то время как вы перебираете вспомогательные массивы, но это может считаться практикой мутировать, пока вы итерации. Тем не менее, способ сделать это было бы использовать паф версию compact
метода, который мутирует исходный объект в:
.reject { |arr| arr.compact!.empty? }
Это займет [[1, 2, nil, 3]]
и вернуть [[1, 2, 3]]
.
Как sagarpandya82 отметил, вы можете также использовать all или any? методы просто проверить, все ли nil
, или если что-то nil
вместо удаления nil
с.
Резюмируя:
original_array = [[nil, nil],[1, nil, 2], [1, 2, 3]]
original_array.reject { |arr| arr.all?(:nil) } # returns [[1, nil, 2], [1, 2, 3]]
original_array.reject { |arr| arr.compact.empty? } # returns [[1, nil, 2], [1, 2, 3]]
original_array.reject { |arr| arr.any?(:nil) } # returns [[1, 2, 3]]
original_array.reject { |arr| arr.compact!.empty? } # returns [[1, 2, 3], [1, 2]]
насчет подрешетки '[1 , 2, ноль, 3] '? –