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

278
Vistas
Combinar una matriz comparando la matriz de objetos dentro de la matriz

tengo la siguiente matriz

 var array = [ { group: "FL", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "C", value: "California" } ] }, { group: "NZ", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "D", value: "Delhi" } ] }, { group: "QA", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "C", value: "California" } ] } ]

Necesito verificar la matriz de la lista y si todos los objetos en la matriz de la lista son exactamente iguales, entonces necesito fusionarlos como se muestra a continuación:

 [ { group: "FL,QA", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "C", value: "California" } ] }, { group: "NZ", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "D", value: "Delhi" } ] } ]

Intenté esto usando el método de reducción para recorrer la matriz y otras dos funciones para comparar los objetos, pero de alguna manera no funciona

 array.reduce(async(acc, item) => { const exist = await compareObjects(acc, item); if (exist) { acc[exist.index].group= exist.group + ',' + item.group; } else { acc.push(item) } return acc; }, []) async function compareObjects(o1, o2) { for (let i = 0; i < o1.length; i++) { const value = await checkObjs(o1[i].list, o2.list); if(value) { return {index:i , group: o1[i].group} } } } function checkObjs(arr1, arr2) { return arr1.length === arr2.length && arr1.every((el, i) => objectsEqual(el, arr2[i])) } const objectsEqual = (o1, o2) => Object.keys(o1).length === Object.keys(o2).length && Object.keys(o1).every(p => o1[p] === o2[p]);

Cualquier ayuda sería apreciada . Gracias

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Su uso de async es lo que lo está haciendo tropezar aquí, y no estoy seguro de su razón para usarlo.

Para hacer que su código funcione como está, debe await el acumulador en cada iteración y asignar el resultado de reduce() a algo.

 var array = [ { group: 'FL', list: [ { key: 'A', value: 'Alaska' }, { key: 'B', value: 'Brazil' }, { key: 'C', value: 'California' }, ], }, { group: 'NZ', list: [ { key: 'A', value: 'Alaska' }, { key: 'B', value: 'Brazil' }, { key: 'D', value: 'Delhi' }, ], }, { group: 'QA', list: [ { key: 'A', value: 'Alaska' }, { key: 'B', value: 'Brazil' }, { key: 'C', value: 'California' }, ], }, ]; function checkObjs(arr1, arr2) { const objectsEqual = (o1, o2) => Object.keys(o1).length === Object.keys(o2).length && Object.keys(o1).every((p) => o1[p] === o2[p]); return arr1.length === arr2.length && arr1.every((el, i) => objectsEqual(el, arr2[i])); } async function compareObjects(o1, o2) { for (let i = 0; i < o1.length; i++) { const value = await checkObjs(o1[i].list, o2.list); if (value) { return { index: i, group: o1[i].group }; } } } // assign the result of reduce to a variable const result = array.reduce(async (acc, item) => { acc = await acc; // await the returned accumulator Promise const exist = await compareObjects(acc, item); if (exist) { acc[exist.index].group = exist.group + ',' + item.group; } else { acc.push(item); } return acc; }, []); result.then((r) => console.log(r));
 .as-console-wrapper { max-height: 100% !important; top: 0; }

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede usar Array.reduce() para crear un mapa de sus objetos de entrada.

Crearemos una función getListKey() para crear una clave única basada en cada lista de objetos.

Una vez que tengamos nuestro mapa, podemos usar Object.values() para obtener el resultado de la matriz:

 var array = [ { group: "FL", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "C", value: "California" } ] }, { group: "NZ", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "D", value: "Delhi" } ] }, { group: "QA", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "C", value: "California" } ] } ] function getListKey(list) { return JSON.stringify(list.sort(({ key: a }, { key: b }) => a.localeCompare(b))); } const result = Object.values(array.reduce((acc, { group, list }) => { const key = getListKey(list); if (!acc[key]) { acc[key] = { group, list }; } else { acc[key].group += "," + group; } return acc; }, {})) console.log('Result:', result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

Otra forma de abordar esto es usar nuevamente Array.reduce() , pero usando la función lodash _.isEqual() para la comparación de listas. Esto realiza una comparación profunda. Usaríamos esto junto con Array.find() para obtener cualquier lista duplicada.

 var array = [ { group: "FL", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "C", value: "California" } ] }, { group: "NZ", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "D", value: "Delhi" } ] }, { group: "QA", list: [ { key: "A", value: "Alaska" }, { key: "B", value: "Brazil" }, { key: "C", value: "California" } ] } ] const result = array.reduce((acc, cur) => { const foundItem = acc.find(item => _.isEqual(item.list, cur.list)); if (foundItem) { foundItem.group += `,${cur.group}`; } else { acc.push(cur); } return acc; }, []) console.log('Result:', result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" referrerpolicy="no-referrer"></script>

about 4 years ago · Juan Pablo Isaza Denunciar

0

Reduce no funciona con async/await . Si no tiene un código async , uno que obtenga algo de una API o use datos de una Promesa, debe eliminar el código async/await porque es síncrono.

Si el código que tiene usa alguna API asíncrona, intente usar algo como:

 export const reduceAsync = async (array, transformer, initialvalue) => { let accumolator = typeof initialValue !== 'undefined' ? initialValue : array[0]; for (let i = 0; i < array.length; i++) { accumolator = await transformer(accumolator, array[i], i, array); } return accumolator; };

La función anterior es reutilizable y sigue las especificaciones definidas aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

about 4 years ago · Juan Pablo Isaza 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