Dada una matriz de datos 2d o 3d. ¿Cómo se puede crear una función que convierta los datos en objeto de matrices, donde el índice interno se asigna a x, y o z dependiendo de si el índice es 0, 1 o 2 respectivamente? Por ejemplo:
// 2d const inputData2d = [ [-1, 4], [3, 6], [9, -8], ] const outputData2d = { x: [-1, 3, 9], y: [4, 6, -8], } // 3d const inputData3d = [ [-1, 4, 5], [3, 6, 2], [9, -8, 5], ] const outputData3d = { x: [-1, 3, 9], y: [4, 6, -8], z: [5, 2, 5], } La función también debería poder manejar datos 2d y 3d, comportándose como se esperaba. He explorado el uso pipe y assoc pero hasta el momento no he tenido suerte.
Con Ramda, puede transponer la matriz de matrices y luego usar R.zipObj para combinarla con las claves. R.zipObj trunca las matrices comprimidas al más corto de los dos, por lo que puede proporcionar ['x', 'y', 'z'] , y se truncaría a ['x', 'y'] para el 2d datos.
const { pipe, transpose, zipObj } = R const fn = pipe(transpose, zipObj(['x', 'y', 'z'])) const inputData2d = [[-1,4],[3,6],[9,-8]] const inputData3d = [[-1,4,5],[3,6,2],[9,-8,5]] console.log(fn(inputData2d)) console.log(fn(inputData3d)) <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> Y la misma idea funciona con lodash, aunque es más detallado. Deberá usar _.unzip() en lugar de R.transpose, y seleccionar claves con valores usando _.pickBy() :
const { flow, unzip, zipObject, pickBy } = _ const fn = flow( unzip, arr => zipObject(['x', 'y', 'z'], arr), obj => pickBy(obj) ) const inputData2d = [[-1,4],[3,6],[9,-8]] const inputData3d = [[-1,4,5],[3,6,2],[9,-8,5]] console.log(fn(inputData2d)) console.log(fn(inputData3d)) <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>Y puede eliminar parte de la verborrea con Lodash/fp:
const { flow, unzip, zipObject, pickBy, identity } = _ const fn = flow( unzip, zipObject(['x', 'y', 'z']), pickBy(identity) ) const inputData2d = [[-1,4],[3,6],[9,-8]] const inputData3d = [[-1,4,5],[3,6,2],[9,-8,5]] console.log(fn(inputData2d)) console.log(fn(inputData3d)) <script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>Primero, transponga la entrada y luego comprímala en un objeto .
const matrixToTransposedObject = R.compose( R.zipObj(["x", "y", "z"]), R.transpose ); const inputData2d = [ [-1, 4], [3, 6], [9, -8], ]; const outputData2d = matrixToTransposedObject(inputData2d); console.log(outputData2d); const inputData3d = [ [-1, 4, 5], [3, 6, 2], [9, -8, 5], ]; const outputData3d = matrixToTransposedObject(inputData3d); console.log(outputData3d); <script src="https://unpkg.com/ramda@0.27.1/dist/ramda.min.js"></script>