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?
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).
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)
=> ["A", "B", "C"]
Voici ce qui fonctionne pour moi:
[1, "", 2, "hello", nil].reject(&:blank?)
sortie:
[1, 2, "hello"]
Dans mon projet, j'utilise delete
:
cities.delete("")
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.
Essaye ça:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
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"]
Utilisez reject
:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
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?
.
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?
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"]
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]
Vous pouvez essayer ceci
cities.reject!(&:empty?)
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? }
Chemin le plus court cities.select(&:present?)
une autre méthode:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]