2017-07-12 1 views
0

Avec Ruby, je suis curieux de savoir comment supprimer les éléments de début et de fin d'un tableau de chaînes si ces éléments sont vides (nil ou la chaîne vide). Si j'ai un tableau deComment "rogner" mon tableau de chaînes?

["", "a", "", "b", nil, ""] 

Je voudrais que le résultat soit

["a", "", "b"] 

J'ai trouvé une façon partielle pour éliminer les bons éléments non présents d'un tableau en utilisant

arr.pop until arr.last || arr.empty? 

Mais cela ne semble fonctionner qu'avec l'ajustement des éléments nil de la fin de mon tableau. Il n'aborde pas les chaînes vides et ne supprime pas les éléments vides à l'avant d'un tableau.

+1

Cela ressemble à un "[XY Problem] (https://meta.stackexchange.com/q/66377/153968)". Je vous recommande de montrer ce qui génère les tableaux, car cela devrait être ce que vous demandez. –

Répondre

1
array. 
drop_while { |element| element.nil? || element.empty? }. 
reverse. 
drop_while { |element| element.nil? || element.empty? }. 
reverse 

Si vous souhaitez supprimer la répétition:

blank = ->(element) { element.nil? || element.empty? } 

array.drop_while(&blank).reverse.drop_while(&blank).reverse 

Si vous utilisez un soutien actif, vous pouvez le faire directement:

array.drop_while(&:blank?).reverse.drop_while(&:blank?).reverse 
+1

'array.drop_while (& vide) .reverse_each.drop_while (& vide)' est légèrement mieux IMO – steenslag

+0

@steenslag, pourquoi ce que vous suggérez mieux? –

+0

@steenslag, j'ai oublié qu'il existe (: – ndn

2

est ici une sorte de solution clunky qui consiste à tester le premier élément et le retirer avec shift, tout en faisant la même chose avec la dernière et pop:

list = [nil, "", "a", "", "b", nil, "", nil] 

while ((!list.first or !list.first.match(/\S/)) and list.any?) 
    list.shift 
end 

while ((!list.last or !list.last.match(/\S/)) and list.any?) 
    list.pop 
end 

list 
# => ["a", "", "b"] 

Rappelez-vous que les chaînes vides sont encore logiquement vrai dans Ruby, comme tout ce qui n'est pas littéralement nil ou false sera. Si vous êtes dans Ruby on Rails ou que vous utilisez ActiveSupport, vous aurez accès à la méthode .present? qui est un test plus rigoureux, nécessitant la définition de la chaîne et contenant au moins un caractère autre qu'un espace.

0
ndx = array.index { |e| !e.to_s.empty? } 
array[ndx..array.rindex { |e| !e.to_s.empty? }] unless ndx.nil? 
    #=> ["a", "", "b"] 

Si e #=> nil , e.to_s #=> ''.

+1

Juste un FYI si le tableau est [], ce qui précède donne une erreur –

+0

Bon point, c'était aussi un problème si le tableau ne contenait rien d'autre que 'nil' et' '' ''. –