Tengo una serie de objetos como este:
const arrayOfObjects = [ { A: 1, B: 2, C: 3 }, { A: 3, B: 4, C: 1 } ]Y otra matriz que se llama "encabezados"
const headers = [ ['A', 'B'], ['C'] ] Tengo que crear una matriz similar a la primera pero con esos objetos divididos por los headers que tienen en sus matrices.
Este debería ser el objetivo:
const result = [ [ { A: 1, B: 2 }, { C: 3 } ], [ { A: 3, B: 4 }, { C: 1 } ] ]Lo intenté haciendo una matriz "base" con:
const baseArray = [] headers.forEach((header) => { const objFromHeader = {}; header.forEach((head) => { objFromHeader[head] = 0; }); baseArray.push(objFromHeader); }); Eso me dará la matriz de result pero con 0 valores para cada clave.
Y luego haga un bucle para la primera matriz y coloque dentro de otra matriz la matriz base con los valores correctos.
Luego, quise completar cada clave de acuerdo con el valor que proviene de arrayOfObjects , pero aquí es donde no puedo ver cómo podría hacer un bucle en esa matriz de objetos y poner el valor correcto. El único problema con ese enfoque es que la matriz de result tendrá algunos valores 0 que provienen de la matriz de iniciación que estoy usando, sería mejor para mí solo poner los objetos que realmente tienen valores y no 0 (estaba pensando en otra función para eliminar esas claves con valor = 0...)
¿Cómo podría lograrlo de una mejor manera?
Violín:
const arrayOfObjects = [ { A: 1, B: 2, C: 3 }, { A: 3, B: 4, C: 1 }, ]; const headers = [['A', 'B'], ['C', 'D']]; const result = arrayOfObjects.map((obj) => headers.map((header) => header.reduce((acc, key) => { acc[key] = obj[key]; return Object.keys(acc).reduce((newAcc, key) => { if (acc[key]) { newAcc[key] = acc[key]; } return newAcc; } , {}); }, {}) ) ); console.log(result);Al iterar sobre un objeto, use findIndex en los headers para identificar en qué índice de la matriz de encabezados debe ir la propiedad que se está iterando. Cree un objeto allí si aún no existe y establezca la propiedad.
const arrayOfObjects = [ { A: 1, B: 2, C:3 }, { A: 3, B: 4, C:1 } ]; const headers = [ ['A', 'B'], ['C'] ]; const toResultItem = (object) => { const resultItem = []; for (const [key, value] of Object.entries(object)) { const headersIndex = headers.findIndex(arr => arr.includes(key)); resultItem[headersIndex] ??= {}; resultItem[headersIndex][key] = value; } return resultItem; }; console.log(arrayOfObjects.map(toResultItem));Implementación Array.forEach
Lógica
arrayOfObjects .headers .headers .headers con valores de los objetos en la matriz arrayOfObjects . const arrayOfObjects = [ { A: 1, B: 2, C: 3 }, { A: 3, B: 4, C: 1 } ]; const headers = [ ['A', 'B'], ['C'] ]; const baseArray = [] arrayOfObjects.forEach((obj) => { const childNode = []; headers.forEach((head) => { const node = {}; head.forEach((key) => node[key] = obj[key]); childNode.push(node); }); baseArray.push(childNode); }); console.log(baseArray) Implementación de Array.map y Array.reduce .
Usando los mismos implementos lógicos en la solución anterior, podemos reescribir esto usando Array.map y Array.reduce como se muestra a continuación.
const arrayOfObjects = [ { A: 1, B: 2, C: 3 }, { A: 3, B: 4, C: 1 } ]; const headers = [ ['A', 'B'], ['C'] ]; const output = arrayOfObjects.map((obj) => { return headers.map((header) => { return header.reduce((acc, curr) => { acc[curr] = obj[curr]; return acc; }, {}); }) }) console.log(output);