web-dev-qa-db-fra.com

Comment puis-je supprimer des éléments vides d'un tableau?

J'ai le tableau suivant 

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

Je veux supprimer des éléments vides du tableau et je veux le résultat suivant:

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

Existe-t-il une méthode telle que compact qui le fasse sans boucles? 

248
a5his

Il y a plusieurs façons de le faire, l'une est reject

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

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

454
Matt Greer
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)

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

Voici ce qui fonctionne pour moi:

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

sortie: 

[1, 2, "hello"]
60
kimerseen

Dans mon projet, j'utilise delete:

cities.delete("")
52
esio

Quand je veux ranger un tableau comme celui-ci, j'utilise:

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

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

39
superluminary

Essaye ça:

puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
21
Raels

Plus explicite

cities.delete_if(&:blank?)

Cela supprimera les valeurs nil et les valeurs de chaîne vide ("").

Par exemple:

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

cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
21
phlegx

Utilisez reject:

>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
17
the Tin Man
cities.reject! { |c| c.blank? }

La raison pour laquelle vous souhaitez utiliser blank? au-dessus de empty? est que vierge reconnaît nil, les chaînes vides et les espaces. Par exemple:

cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }

reviendrait quand même:

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

Et appeler empty? sur " " renverra false, que vous voudrez probablement être true.

Remarque: blank? est uniquement accessible via Rails, Ruby ne prend en charge que empty?.

14
Colton Fent

Il y a déjà beaucoup de réponses, mais voici une autre approche si vous êtes dans le monde Rails:

 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
10
Naveed

Voici une autre approche pour y parvenir

nous pouvons utiliser presence avec select

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

cities.select(&:presence)

["Kathmandu", "Pokhara", "Dharan", "Butwal"]
9
Sampat Badhe

Voici une solution si vous avez des types mixtes dans votre tableau:

[nil,"some string here","",4,3,2]

Solution:

[nil,"some string here","",4,3,2].compact.reject{|r| r.empty? if r.class == String}

Sortie:

=> ["some string here", 4, 3, 2]
8
Francois

Vous pouvez essayer ceci

 cities.reject!(&:empty?)
4
anusha
 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? } 
2
suren

Chemin le plus court cities.select(&:present?)

1
Javier Segovia

une autre méthode:

> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
0
p4ndepravity