2017-02-21 19 views
0

Использование .flatten - это удобный небольшой трюк, чтобы взять массив суб-массивов и превратить его в один массив. Например: [[1,3],2,[5,8]].flatten =>[1,3,2,5,8] Вы можете даже включить nil [1,[2,nil],3].flatten приведет к [1,2,nil,3].Ruby - элегантно сгладить массив, но не игнорировать пустые подмассивы

Этот метод очень полезен при вложении метода .map, но как бы вы определили пустой подматрица? Например: [1,[2,3],[],4].flatten вернется [1,2,3,4] ... но что, если мне нужно следить за пустой массив к югу возможно преобразовать результат в [1,2,3,0,4] или [1,2,3,nil,4]

Есть ли элегантный способ сделать это? Или мне нужно написать какой-то метод для итерации через каждый отдельный под-массив и проверить его один за другим?

+0

вы должны проверить вложенные пустой ли массивы, то есть '[1, [2, 3, []], 4]'? – eiko

ответ

5

Если вам не нужно рекурсивно проверять вложенные подмассивы:

[1,[2,3],[],4].map { |a| a == [] ? nil : a }.flatten 
+0

Это немного чище, чем у меня. Я изменил == [] на a.any? но аналогичная концепция ... По какой-то причине я всегда забываю приложить логику в свои блоки .map. – jkessluk

+1

@jkessluk не будет a.any? дроссель на элементах, которые не являются массивами? – eiko

+0

Да, но я использую это в вспомогательном методе, где я уже убедился, что переданный элемент является массивом. В противном случае, да. Вы правы. – jkessluk

1

Первая карта пустых массивов в nil с, затем расплющить

[1,2,[1,2,3],[]].map{|x| if x.is_a? Array and x.empty? then nil else x end}.flatten