11
votes

Effacer les cordes vides d'un tableau

Je traite avec un tas de tableaux de chaînes et plusieurs fois j'ai écrit .Delete_if {| str | str.empty? }

Maintenant, je sais que je peux ajouter cette méthode à la classe Array moi-même mais j'espère qu'il y a une manière intégrée pour le faire sans méthodes non standard ajoutées aux classes de base. Autant amusement que l'ajout de méthodes aux classes de base est, ce n'est pas quelque chose que je veux faire pour des raisons de maintenabilité.

Y a-t-il une méthode intégrée pour gérer cela?


11 commentaires

J'ai le même problème que vous. Presque toujours, je veux faire cela juste avant rejoindre , donc dans mon cas, j'ai fait une méthode similaire à joindre mais supprime les blancs précédemment.


Donc quelle est la question?


@ FL00R, que ce soit ou non, il est intégré de le faire.


@sawa, il y a méthode compact suppression de tous les éléments NIL, mais il n'y a pas de méthode standard pour supprimer toutes les chaînes vides.


@ FL00R DROITE. Ce sera la réponse courte à la question.


compact ne supprime pas d'éléments, il renvoie un nouveau tableau ne contenant pas les éléments. Les méthodes non destructives sont généralement plus faciles à utiliser car elles ne dépendent pas d'effets secondaires.


@Rein Henrichs, Okey Il y a compact! Méthode :)


Qu'est-ce qui ne va pas avec juste ajouter une nouvelle méthode à la classe Array?


Rien de mal s'il est bien documenté avant utilisation et s'il est clair pour tous les travailleurs d'équipe :)


Quelques grandes chances, mais malheureusement, la réponse réelle est no.


Dupliqué possible de Comment supprimer des éléments vides d'un tableau? < / a>


8 Réponses :


38
votes

Il existe une forme courte

array.delete_if(&:empty?)


2 commentaires

Si vous utilisez des rails, Array.Delete_if (&: videa) est une meilleure option pour éviter une nométhodeurror si l'une des valeurs est nulle.


Array.compact.Delete_if (&: vide?) gérera la nul et le vide dans Pure Ruby.



0
votes

Vous pouvez utiliser .Sélectionnez! Mais vous allez toujours courir dans le même problème.

au lieu de modifier la matrice, vous pouvez créer une classe d'utilité à la place.


0 commentaires

5
votes

Eh bien, il y a array.delete strong>. Il renvoie ce qui est supprimé (ou nil si rien n'est supprimé) cependant, ce qui se sent maladroit. Mais il fournit et n'échoue pas les éléments non à cordes:

ar = ['a', '', 2, 3, '']
p ar.delete('')  #=> ""
p ar             #=> ["a", 2, 3]


1 commentaires

J'aime celui la. Il y a quelques semaines, il s'agissait donc de discussions sur la méthode qui supprime un élément et se retourne. comme array.delete (élément); Array



1
votes

Vous pouvez faire ce xxx

J'espère que cela fonctionnera pour vous


0 commentaires

8
votes

Vous pouvez utiliser cette méthode: xxx

Veuillez noter que vous pouvez utiliser la méthode compact si vous ne devez éteindre qu'un tableau de NITLS.


0 commentaires

0
votes

Vous pouvez essayer en dessous de la solution. J'espère que cela vous aidera.

Array = ["", "", nil, nil, 2,3] array.delete_if (&: vide?) => [2,3]


0 commentaires

0
votes

Si vous souhaitez également supprimer NIL:

arr = ['',"",nil,323]
arr.map!{|x|x==''?nil:x}.compact!

=> [323]


1 commentaires

Contrairement aux autres méthodes, cette ligne évalue comme la matrice renvoyée plutôt que ce qui a été supprimé