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.
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}
Ne rejeter que nil
serait:
array.compact
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.
Si vous avez vraiment besoin de rejeter nil
uniquement, procédez comme suit:
scores.reject(&:nil?)
Essaye ça :
scores.select{|e| e.is_a? Integer}
# => [1, 2, 3, 4]
Cela a fonctionné pour moi
scores.reject!{|x| x.to_s.empty?}
scores = [1, 2, 3, "", 4, nil]
scores.reject{|s| s.to_s == ''}
# => [1, 2, 3, 4]
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.
&: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.