346 votes

Comment supprimer les éléments vides d'un tableau ?

J'ai le tableau suivant

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]

Je veux supprimer les éléments vides du tableau et obtenir le résultat suivant :

cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

Existe-t-il une méthode comme compact qui le fera sans boucles ?

562voto

Matt Greer Points 29401

Il y a plusieurs façons de le faire, l'une d'entre elles étant reject

noEmptyCities = cities.reject { |c| c.empty? }

Vous pouvez également utiliser reject! qui modifiera cities en place. Il retournera soit cities comme valeur de retour s'il a rejeté quelque chose, ou nil si aucun rejet n'est effectué. Cela peut être un piège si vous ne faites pas attention (merci à ninja08 de l'avoir signalé dans les commentaires).

248 votes

Ou si vous préférez une version plus compacte cities.reject!(&:empty?)

61 votes

Hm, pourquoi pas cities.reject!(&:blank?) ? empty? est pour les tableaux

31 votes

@Nico blank? est uniquement disponible par le biais de ActiveSupport . Ruby standard utilise String#empty? : ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F

188voto

user2010324 Points 541
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)

=> ["A", "B", "C"]

14 votes

Je préférerais utiliser .reject(&:blank ?) pour éviter également les valeurs nulles.

8 votes

@RanGalili blank? est un bon choix mais son rails et cette question concerne la méthode simple ruby

117voto

kimerseen Points 231

Voici ce qui fonctionne pour moi :

[1, "", 2, "hello", nil].reject(&:blank?)

sortie :

[1, 2, "hello"]

1 votes

Sous Ruby 2.3.1, j'obtiens NoMethodError : "undefined method `blank?' for 1:Fixnum" en essayant d'exécuter ceci.

2 votes

@Tom blank ? est une méthode spécifique à Rails. Elle n'existe pas dans Array pour ruby. Vous devrez utiliser empty ? ou écrire votre propre méthode.

0 votes

Merci pour la clarification, c'est le problème que j'ai eu à réaliser. :blank? est spécifique à Rails.

57voto

esio Points 342

Dans mon projet, j'utilise delete :

cities.delete("")

6 votes

Élégant ! Malheureusement, il ne retourne pas le tableau restant, mais c'est plutôt astucieux.

12 votes

La méthode Array.delete est contre-intuitive. Elle fonctionne comme un .delete !() si une telle méthode existait. Le .delete() opère directement sur le tableau d'une manière destructive.

46voto

superluminary Points 5496

Lorsque je veux mettre de l'ordre dans un tableau comme celui-ci, j'utilise :

["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]

Cela supprimera tous les éléments vides ou nuls.

1 votes

En fait, la réponse de l'Homme de Fer est meilleure car elle supprimera également tout ce qui correspond à Object#blank ? c'est-à-dire nil, "", "". \n ", " ", " \n\r ", etc. Contrairement à la réponse acceptée, elle fonctionnera également sans Rails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X