Tengo 2 matrices que consisten en objetos:
a = [ { id: 105647, name: 'name1' }, { id: 105941, name: 'name2' }, { id: 106177, name: 'name3' } ] b = [ [ { id: 105647, transactionDate: '2022-03-21', order: 1 }, { id: 105647, transactionDate: '2022-03-22', order: 2 } ], [ { id: 106177, transactionDate: '2022-03-24', order: 1 }, ] ] Como puede ver, eso en b no siempre tiene datos para cada id en la variable a .
Y mi resultado deseado sería
a = [ { id: 105647, name: 'name1', dataB: [ { id: 105647, transactionDate: '2022-03-21', order: 1 }, { id: 105647, transactionDate: '2022-03-22', order: 2 } ] }, { id: 105941, name: 'name2' }, { id: 106177, name: 'name3', dataB: [ { id: 106177, transactionDate: '2022-03-24', order: 1 }, ] } ] la variable b debe enviarse a la nueva variable dataB dentro del objeto de la matriz en la variable a . Y si no existen datosB en a , no crearía dataB en a /crearía los dataB pero con una matriz vacía.
ya estaba probando con algunos
for (let i = 0; i<a.length; i++) { a[i]['dataB'] = b[i] } el resultado no es empujado por id , sino por índice. El problema es que b no siempre tiene datos para cada id en la variable a . Y lo que intento no es lo que busco.
Pregúnteme si necesita más información si aún no es suficiente para resolver ese caso.
loop pensó a matriz,
en cada iteración encontrar todas las coincidencias
si la matriz no está vacía, asígnela a un nuevo campo dataB
const a = [ { id: 105647, name: 'name1' }, { id: 105941, name: 'name2' }, { id: 106177, name: 'name3' } ] const b = [ [ { id: 105647, transactionDate: '2022-03-21', order: 1 }, { id: 105647, transactionDate: '2022-03-22', order: 2 } ], [ { id: 106177, transactionDate: '2022-03-24', order: 1 }, ] ]; const result = a.map(i => { const foundTrancactions = b.flat().filter(el => el.id === i.id); return {...i, ...(foundTrancactions?.length ? {dataB: foundTrancactions} : {})} }) console.log(result)ACTUALIZAR
bflat() agregado para bSi su objetivo es modificar un , en lugar de crear una nueva matriz, puede usar los métodos Array#forEach y Array#filter de la siguiente manera:
const a = [ { id: 105647, name: 'name1' }, { id: 105941, name: 'name2' }, { id: 106177, name: 'name3' } ]; const b = [ [ { id: 105647, transactionDate: '2022-03-21', order: 1 }, { id: 105647, transactionDate: '2022-03-22', order: 2 } ], [ { id: 106177, transactionDate: '2022-03-24', order: 1 }, ] ]; a.forEach((elA,i) => { const others = b.filter(elB => elB.every(o => o.id === elA.id)).flat(); a[i] = others.length ? {...elA, dataB: others} : elA; }); console.log( a ); Dado que en b los elementos ya están agrupados por id , Array#find puede ser un mejor método y no necesitará el uso de Array#flat :
const a = [ { id: 105647, name: 'name1' }, { id: 105941, name: 'name2' }, { id: 106177, name: 'name3' } ]; const b = [ [ { id: 105647, transactionDate: '2022-03-21', order: 1 }, { id: 105647, transactionDate: '2022-03-22', order: 2 } ], [ { id: 106177, transactionDate: '2022-03-24', order: 1 }, ] ]; a.forEach((elA,i) => { const others = b.find(elB => elB.every(o => o.id === elA.id)); a[i] = others ? {...elA, dataB: others} : elA; /*OR: you can replace the above one line with the following 3 if( others ) { a[i].dataB = others; }*/ }); console.log( a );Esta solución no muta y emplea la idea compartida por Barmar en los comentarios anteriores.
Fragmento de código
const getTransformedArray = (orig, delta) => { // first, construct a key-value pair using "b" array (called "delta" here) const deltaMap = delta .flat() // since "b" is nested, use ".flat()" to flatten it .reduce( (acc, itm) => ({ ...acc, // retain existing results from "acc" (accumulator) [itm.id]: ( acc[itm.id] || [] // if "itm.id" already exists, keep its array ).concat([{...itm}]) // append the current "itm" }), {} // "acc" is initially set to empty object "{}" ); // now, iterate through "a" array (named "orig" here) return orig.map( ({id, name}) => ({ // de-structure to directly access "id", "name" props id, name, // retain "id", "name" ...( // add new prop "dataB" only if it's in deltaMap id in deltaMap ? { dataB: deltaMap[id] } : {} // if no matching "id" in "deltaMap", don't add "dataB" ) }) ); }; const a = [ { id: 105647, name: 'name1' }, { id: 105941, name: 'name2' }, { id: 106177, name: 'name3' } ] const b = [ [ { id: 105647, transactionDate: '2022-03-21', order: 1 }, { id: 105647, transactionDate: '2022-03-22', order: 2 } ], [ { id: 106177, transactionDate: '2022-03-24', order: 1 }, ] ]; // invoke the transform function console.log('transformed array: ', getTransformedArray(a, b)); // display "a" and "b" arrays to show those were not mutated console.log('original a: ', a); console.log('original b: ', b); .as-console-wrapper { max-height: 100% !important; top: 0 }Explicación
Comentarios en línea proporcionados en el fragmento anterior.