web-dev-qa-db-fra.com

Ruby supprime les valeurs nil d'un tableau avec .reject

J'ai un tableau:

scores = [1, 2, 3, "", 4]

Et je veux supprimer toutes les valeurs vides. Mais quand je lance ceci:

puts scores.reject(&:empty?)

Je reçois une erreur:

undefined method `empty' for 1:Fixnum

Comment puis-je supprimer des valeurs qui ne sont pas des entiers de mon tableau dans un processus en une étape? J'utilise Ruby 1.9.3.

21
Luigi

C'est aussi simple que:

scores.grep(Integer)

Notez que si vous prévoyez de mapper les valeurs, vous pouvez le faire dans un bloc après:

scores.grep(Integer){|x| x+1 }

Bonus si vous voulez faire la même chose, mais que vos chiffres sont des chaînes:

scores.grep(/\d+/){|x|x.to_i}
18
hirolau

Ne rejeter que nil serait:

array.compact

40

Si vous souhaitez supprimer les valeurs vides, vous devez utiliser blank?: (nécessite Rails/ActiveSupport).

scores.reject(&:blank?)
#=> [1, 2, 3, 4]

"", " ", false, nil, [] et {} sont vides.

20
Stefan

Si vous avez vraiment besoin de rejeter nil uniquement, procédez comme suit:

scores.reject(&:nil?)
2
kovpack

Essaye ça :

scores.select{|e| e.is_a? Integer}
# => [1, 2, 3, 4]
2
Arup Rakshit

Cela a fonctionné pour moi 

scores.reject!{|x| x.to_s.empty?}
1
anusha
scores = [1, 2, 3, "", 4, nil]
scores.reject{|s| s.to_s == ''}
# => [1, 2, 3, 4]
1
AlexQueue
scores.select{|score| score.is_a? Fixnum}

ou, comme Fixnum hérite d'Integer, vous pouvez également opter pour

scores.select{|score| score.is_a? Integer)

... si cela semble plus descriptif.

Array et Enumerable ont tendance à offrir de nombreuses façons de faire la même chose.

0
Mark Weston

&:empty? fonctionnera pour les hachages, les tableaux et les chaînes, mais pas les nombres. La méthode que vous utilisez dans rejet doit être valide pour tous les éléments d'une liste. &:blank? fonctionnera bien pour cette raison.

0
Pat McGee