RoR / Ruby elimina elementos nulos de una matriz anidada
-
05-07-2019 - |
Pregunta
Para dividir una matriz en dos partes iguales, haría esto,
>> 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]]
Ahora tengo una matriz anidada que contiene elementos nulos si el tamaño de la matriz es impar. ¿Cómo puedo eliminar los elementos nulos de las matrices anidadas? Quiero hacer algo como,
a.compact
Pero desafortunadamente eso no funciona, ruby ??solo elimina elementos nulos en el primer nivel y no de forma recursiva. ¿Ruby proporciona alguna buena solución para este problema?
Solución
Con Ruby 1.8.7 y posterior puede hacer lo siguiente:
a.each &:compact!
=> [[1, 2, 3], [4, 5]]
Con Ruby 1.8.6, debe hacerlo a lo largo:
a.each {|s| s.compact!}
Ambos modificarán el contenido de a
. Si desea devolver una nueva matriz y dejar el original solo, puede usar collect
en lugar de each
:
# 1.8.7+:
a.collect &:compact
# 1.8.6:
a.collect {|s| s.compact}
Otros consejos
Si tuviera que usar el in_groups_of
puede pasarlo false
como segundo argumento y no rellenará los espacios en blanco " con nil
, pero realmente nada.
A menos que desee cambiar 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!
Debería funcionar ...