2017-02-21 1 views
0

L'utilisation de .flatten est une petite astuce pratique pour prendre un tableau de sous-matrices et le transformer en un seul tableau. Par exemple: [[1,3],2,[5,8]].flatten =>[1,3,2,5,8] Vous pouvez même inclure [1,[2,nil],3].flatten entraînera [1,2,nil,3].Ruby - aplatit élégamment un tableau mais n'ignore pas les sous-tableaux vides

Ce type de méthode est très utile lors de l'imbrication d'une méthode .map, mais comment représenter un sous-tableau vide? Par exemple: [1,[2,3],[],4].flatten retournerait [1,2,3,4] ... mais si je dois garder une trace du tableau vide sous peut-être tourner le résultat en [1,2,3,0,4] ou [1,2,3,nil,4]

est-il un moyen élégant de le faire? Ou aurais-je besoin d'écrire une méthode pour parcourir chaque sous-groupe et de le vérifier un par un?

+0

Avez-vous besoin de vérifier imbriqué vide tableaux, à savoir '[1, [2, 3, []], 4]'? – eiko

Répondre

5

Si vous n'avez pas besoin de vérifier récursive sous-réseaux imbriqués:

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

C'est un peu plus propre que ce que j'avais. J'ai changé un == [] en a.any? mais un concept similaire ... Pour une raison quelconque, je néglige toujours de mettre la logique dans mes blocs .map. – jkessluk

+1

@jkessluk ne sera pas a.any? étouffer sur les éléments qui ne sont pas des tableaux? – eiko

+0

Oui, mais j'utilise ceci dans une méthode d'aide où j'ai déjà assuré que l'élément passé est un tableau. Sinon, oui. Tu as raison. – jkessluk

1

Première carte les tableaux vides dans nil s, aplatirez

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