Tengo una matriz como esta:
const arr = [ ['1 1 1', '', '2 2 2'], ['', '3 3 3', '4 4 4'] ]y mi objetivo es convertirlo a esta matriz:
[ [ [1,1,1], [2,2,2] ], [ [3,3,3], [4,4,4] ] ]Estoy tratando de hacer eso de manera funcional usando la composición de funciones. También estoy usando Ramda.
tengo este codigo
const filterEmpty = filter(o(not, isEmpty)); const getFinalArr = map( compose( map(map(parseInt)), map(split(' ')), filterEmpty ) ) console.log(getFinalArr(arr)) ¿Hay alguna forma de escribirlo con menos anidamiento de map ? Intenté algo como esto:
const getFinalArr = map( compose( parseInt, map, map, split(' '), map, filterEmpty ) )Pero, por supuesto, no funcionó.
O si hay otra forma de lidiar fácilmente con matrices anidadas como esta, agradecería aprender sobre eso.
Cuando las cosas comienzan a ponerse largas y confusas, prefiero R.pipe en R.compose y escribir la función donde cada línea representa una transformación:
const { map, pipe, reject, isEmpty, split } = R const fn = map(pipe( reject(isEmpty), // remove empty items map(split(' ')), // convert string to sub-arrays map(map(Number)), // convert sub-arrays to arrays of numbers )) const arr = [['1 1 1', '', '2 2 2'], ['', '3 3 3', '4 4 4']] const result = fn(arr) console.log(result) .as-console-wrapper { max-height: 100% !important; top: 0; } <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>También sugeriría considerar la recursividad para este tipo de trabajo.
const parse = R.pipe(R.split(' '), R.map(Number)); const normalize = R.pipe(R.reject(R.isEmpty), R.map(parse), R.of); const fn = ([head, ...tail]) => normalize(head).concat( tail.length ? fn(tail) : [], ); // == const data = [['1 1 1', '', '2 2 2'], ['', '3 3 3', '4 4 4']] console.log( fn(data), ); <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>Podría usar un enfoque ligeramente diferente si echa un vistazo a una solución en Javascriptp puro y la convierte a Ramda.
parse
const { compose, filter, isEmpty, map, not, o, split } = R, array = [['1 1 1', '', '2 2 2'], ['', '3 3 3', '4 4 4']], resultPure = array.map(a => a .filter(Boolean) .map(s => s .split(' ') .map(Number) ) ), fn = map(compose( map(compose( map(Number), split(' ') )), filter(o(not, isEmpty)) )); console.log(fn(array)); console.log(resultPure); .as-console-wrapper { max-height: 100% !important; top: 0; } <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>