Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

149
Vistas
¿Cómo enviar una matriz de objetos a una nueva variable de matriz dentro de otro objeto dentro de la matriz por valor?

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.

about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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

  • han cambiado la matriz b
  • flat() agregado para b
about 4 years ago · Santiago Trujillo Denunciar

0

Si 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 );

about 4 years ago · Santiago Trujillo Denunciar

0

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.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda