RoR / Ruby elimina gli elementi zero dall'array nidificato
-
05-07-2019 - |
Domanda
Per dividere un array in due pezzi uguali farei questo,
>> 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]]
Ora ho un array nidificato che contiene zero elementi se la dimensione dell'array è dispari. Come posso rimuovere gli elementi zero dagli array nidificati? Voglio fare qualcosa del genere,
a.compact
Ma sfortunatamente ciò non funziona, il rubino rimuove solo gli elementi zero al primo livello e non ricorsivamente. Il rubino fornisce delle belle soluzioni a questo problema?
Soluzione
Con Ruby 1.8.7 e versioni successive puoi fare quanto segue:
a.each &:compact!
=> [[1, 2, 3], [4, 5]]
Con Ruby 1.8.6, devi farlo a lungo:
a.each {|s| s.compact!}
Entrambi questi modificheranno il contenuto di a
. Se si desidera restituire un nuovo array e lasciare l'originale da solo, è possibile utilizzare collect
anziché ciascuno
:
# 1.8.7+:
a.collect &:compact
# 1.8.6:
a.collect {|s| s.compact}
Altri suggerimenti
Se dovessi usare in_groups_of
puoi passare false
come secondo argomento e non riempirà gli spazi "quotati" con zero
, ma veramente nulla.
A meno che tu non voglia cambiare permanentemente 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!
Dovrebbe funzionare ....