Obtengo un objeto de matriz que se parece a esto. Mi objetivo es combinarlos o fusionarlos en función de claves duplicadas.
documents: [ { image: 'sample image 1', id_side: 'Front', type: 'Passport' }, { image: 'sample image 2', id_side: 'Back', type: 'Passport' }, { image: 'sample image 3', id_side: 'Back', type: 'License' } ]¿Cómo puedo arreglarlo para que se vea así?
documents: [ { documentType: 'Passport', requiredDocs: [ { image: 'sample image 1', id_side: 'Front', type: 'Passport' }, { image: 'sample image 2', id_side: 'Back', type: 'Passport' } ] }, { documentType: 'License', requiredDocs: [ { image: 'sample image 3', id_side: 'Back', type: 'License' } ] } ]He encontrado una pregunta similar pero parece que no puedo hacer que funcione en mi caso. Vea la pregunta similar en este enlace: ¿Cómo fusionar/combinar una matriz de objetos basados en claves duplicadas?
Puedes lograr tu salida con esto
const documents = [ { image: "sample image 1", id_side: "Front", type: "Passport" }, { image: "sample image 2", id_side: "Back", type: "Passport" }, { image: "sample image 3", id_side: "Back", type: "License" } ]; let output = {}; documents.forEach((docs) => { if (output[docs.type]) { output[docs.type].requiredDocs.push(docs); } else { output[docs.type] = { documentType: docs.type, requiredDocs: [docs] }; } }); console.log(Object.values(output));Use reduce() para crear un objeto de acumulación y luego map() las entradas de ese objeto al formato de salida deseado:
const data = [{ image: 'sample image 1', id_side: 'Front', type: 'Passport' }, { image: 'sample image 2', id_side: 'Back', type: 'Passport' }, { image: 'sample image 3', id_side: 'Back', type: 'License' }]; const result = Object.entries(data.reduce((a, v) => ({ ...a, [v.type]: [...a[v.type] || [], v] }), {})).map(([documentType, requiredDocs]) => ({ documentType, requiredDocs })); console.log(result);Esto supone que la clave con la que desea tratar es type . Cree una asignación de objetos desde el tipo a todos los objetos relevantes y luego map al formato deseado.
const obj={documents:[{image:'sample image 1',id_side:'Front',type:'Passport'},{image:'sample image 2',id_side:'Back',type:'Passport'},{image:'sample image 3',id_side:'Back',type:'License'}]}; let types = obj.documents.reduce((a, { type, ...r }) => { a[type] = a[type] || []; a[type].push({ type, ...r }); return a; }, {}); let result = Object.entries(types).map(([ documentType, requiredDocs ]) => ({ documentType, requiredDocs })); console.log(result); .as-console-wrapper { max-height: 100% !important; top: auto; }