Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

272
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!