web-dev-qa-db-fra.com

Supprimer les chaînes nil et blank dans un tableau en Ruby

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.

27
user4093799

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 == ''.

36
Cary Swoveland

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? }
22
awendt

J'ai tendance à faire:

arr = [1, 2, 's', nil, '', 'd']
arr.reject(&:blank?)

résultats:

=> [1, 2, "s", "d"]
8
JayJay

Vous pouvez également utiliser - pour supprimer tous les éléments nil et '':

arr -= [nil, '']
#=> [1, 2, "s", "d"]

Manifestation

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"]

Manifestation

2
potashin

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 == "" }
2
RockStar

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"]
1
padmapriya

J'espère que cela fonctionnera pour votre cas: 

arr = [1, 2, 's', nil, '', 'd']
arr.select{|x| x.to_s!="" }
0
Varun Gupta

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"]
0
Surya

essayez ceci:

[1, 2, "s", nil, "", "d"].compact.select{|i| !i.to_s.empty?}
0
Sachin Singh

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"]
0
Dom