Question

Pour diviser un tableau en deux parties égales, je le ferais,

>> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
>> a.in_groups_of( (a.size/2.0).ceil ) if a.size > 0
=> [[1, 2, 3], [4, 5, nil]]

Maintenant, j'ai un tableau imbriqué qui ne contient aucun élément si la taille du tableau est impair. Comment puis-je supprimer les éléments nil des tableaux imbriqués? Je veux faire quelque chose comme,

a.compact

Mais malheureusement, cela ne fonctionne pas, ruby ??supprime uniquement les éléments nil du premier niveau et non de manière récursive. Ruby apporte-t-il de bonnes solutions à ce problème?

Était-ce utile?

La solution

Avec Ruby 1.8.7 et versions ultérieures, vous pouvez effectuer les opérations suivantes:

a.each &:compact!
=> [[1, 2, 3], [4, 5]]

Avec Ruby 1.8.6, faites le long chemin:

a.each {|s| s.compact!}

Ces deux éléments modifieront le contenu de a . Si vous voulez retourner un nouveau tableau et laisser l'original seul, vous pouvez utiliser collect au lieu de chaque :

# 1.8.7+:
a.collect &:compact

# 1.8.6:
a.collect {|s| s.compact}

Autres conseils

Si vous utilisiez in_groups_of , vous pouvez lui passer false en tant que deuxième argument. Il ne remplira pas les "espaces vides" " avec nil , mais vraiment rien.

Sauf si vous souhaitez modifier définitivement a

a.map do |e|
  e.compact
end
arr_mixed=['hello', 2222, 'world', nil, [1, 2, 5, 'hi', nil],[1, 2, 3], [4,   5, nil]]

def compact_nested(array)
   arr2=[]
   array.each { |x|
   element = x.class==Array ? x.compact : x
   arr2<<element
   }
   arr2
end

p compact_nested(arr_mixed).compact #=>["hello", 2222, "world", [1, 2, 5, "hi"], [1, 2, 3], [4, 5]]
p arr_mixed #=>["hello", 2222, "world", nil, [1, 2, 5, "hi", nil], [1, 2, 3], [4, 5, nil]]
a.each {|subarray| subarray.compact!}
a.compact!

Devrait fonctionner ....

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top