Je suis nouveau à Ruby et collé avec ce problème. Disons que j'ai un tableau comme celui-ci:
arr = [1, 2, 's', nil, '', 'd']
et je veux supprimer nil et chaîne vide, c'est-à-dire que le tableau final devrait être:
arr = [1, 2, 's', 'd']
J'ai essayé compact
mais cela donne ceci:
arr.compact!
arr #=> [1, 2, 's', '', 'd'] doesn't remove empty string.
Je me demandais s'il y avait un moyen intelligent de faire cela en Ruby.
Vous pourriez faire ceci:
arr.reject { |e| e.to_s.empty? } #=> [1, 2, "s", "d"]
Note nil.to_s => ''
.
Si arr
peut contenir un autre type d'objet vide (par exemple, un tableau ou un hachage) que vous souhaitez conserver, remplacez e.to_s.empty?
par e.to_s == ''
.
Puisque vous voulez supprimer les chaînes nil
et vides, ce n'est pas un doublon de Comment puis-je supprimer des éléments vides d'un tableau?
Vous souhaitez utiliser .reject
:
arr = [1, 2, 's', nil, '', 'd']
arr.reject { |item| item.nil? || item == '' }
NOTE:reject
avec et sans bang se comporte de la même manière que compact
avec et sans bang: reject!
et compact!
modifie le tableau lui-même tandis que reject
et compact
renvoient une copie du tableau et conservent l'original.
Si vous utilisez Rails, vous pouvez également utiliser blank?
. Il a été spécialement conçu pour fonctionner sur nil
. L'appel de méthode devient:
arr.reject { |item| item.blank? }
J'ai tendance à faire:
arr = [1, 2, 's', nil, '', 'd']
arr.reject(&:blank?)
résultats:
=> [1, 2, "s", "d"]
Vous pouvez également utiliser -
pour supprimer tous les éléments nil
et ''
:
arr -= [nil, '']
#=> [1, 2, "s", "d"]
Ou compact
et reject
avec le raccourci (si vous n'utilisez pas Rails, vous pouvez simplement utiliser arr.reject(&:blank?)
)}:
arr = arr.compact.reject(&''.method(:==))
#=> [1, 2, "s", "d"]
Vous pouvez utiliser compact avec rejet
arr = [1, 2, 's', nil, '', 'd']
arr = [1, 2, 's', 'd']
arr = arr.compact.reject { |h| h == "" }
ou
arr = arr.compact.delete_if { |h| h == "" }
Vous pouvez utiliser la méthode compacte et la méthode delete_if pour supprimer les chaînes nil et vide dans un tableau en Ruby.
arr = [1, 2, 's', nil, '', 'd']
arr.compact!.delete_if{|arrVal| arrVal.class == String and arrVal.empty?}
=> [1, 2, "s", "d"]
J'espère que cela fonctionnera pour votre cas:
arr = [1, 2, 's', nil, '', 'd']
arr.select{|x| x.to_s!="" }
Remarque: je considère que le tableau pourrait avoir une chaîne contenant des espaces blancs.
Tu peux faire:
arr = [1, 2, 's', nil, ' ', 'd']
arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '') == '') }
#=> [1, 2, "s", "d"]
ou:
arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '').empty?) }
#=> [1, 2, "s", "d"]
ou si vous voulez mettre à jour l'objet arr
lui-même, alors:
arr.reject!{|a| a.nil? || (a.to_s.gsub(' ', '') == '') } # notice the ! mark, it'll update the object itself.
p arr #=> [1, 2, "s", "d"]
essayez ceci:
[1, 2, "s", nil, "", "d"].compact.select{|i| !i.to_s.empty?}
J'ajouterais probablement .strip
pour éliminer les casse-têtes d'espaces blancs potentiels (en supposant que ce n'est pas une application Rails).
array = [1, 2, "s", nil, " ", "d", "\n"]
array.reject!{|a| a.nil? || (a.to_s.strip.empty?) }
#=> [1, 2, "s", "d"]