Tengo 2 matrices con objetos dentro de ellas:
names = [ { "name": "B" }, { "name": "C" }, { "name": "D" }, { "name": "B" }, { "name": "A" } ] sections = [ { "id": 3638, "name": "B", "type": "PANEL", "parentSectionId": 3635, "order": 1, "page": "595" }, { "id": 3658, "name": "C", "type": "PANEL", "parentSectionId": 3635, "order": 2, "page": "595" }, { "id": 3659, "name": "D", "type": "PANEL", "parentSectionId": 3635, "order": 3, "page": "595" }, { "id": 3636, "name": "A", "type": "PANEL", "parentSectionId": 3635, "order": 4, "page": "595" }, { "id": 3661, "name": "B", "type": "PANEL", "parentSectionId": 3635, "order": 5, "page": "595" } ]Necesito fusionar algunas propiedades de la matriz de secciones dentro de la matriz de nombres. Las propiedades a fusionar son: id y order.
El problema es con la identificación. Debido a que hay un nombre duplicado: 'B', la identificación se está duplicando.
Intenté muchas cosas, pero fallan porque pone el mismo ID 3638 en ambos nombres duplicados: 'B'.
Aquí está el resultado final:
section {id: 3638, name: 'B', order: 1, size: undefined} section {id: 3658, name: 'C', order: 2, size: undefined} section {id: 3659, name: 'D', order: 3, size: undefined} section {id: 3638, name: 'B', order: 4, size: undefined} section {id: 3636, name: 'A', order: 5, size: undefined}Y aquí mi último intento de código:
const childrens = names.map((c, i) => ({ ...c, id: this.sections.find((s) => s.name === c.name).id, order: i + 1, }));Creo que ibas en la dirección correcta.
Para una fusión completa, use:
let children = names.map((name, index) => { return({ order: index +1, name: name.name, ...sections[index] }) })Para fusión parcial:
let children = names.map((name, index) => { return({ name: name.name, order: index+1, id: sections[index].id }) })Creo que no necesitas .find() y solo usas índices
Por lo que entendí, este código conservará el orden de los names duplicados (es una versión sin formato para una prueba de concepto)
merged = [] visited = [] for (let i=0; i<names.length; i++) { for (let j=0; j<sections.length; j++) { if ((names[i].name === sections[j].name) && !visited.find(e => e === sections[j].id) ) { const obj = {...names[i]} obj['order'] = sections[j].order obj['id'] = sections[j].id merged.push(obj) visited.push(sections[j].id) continue } } } console.log(merged)producción:
[ { name: 'B', order: 1, id: 3638 }, { name: 'B', order: 5, id: 3661 }, { name: 'C', order: 2, id: 3658 }, { name: 'D', order: 3, id: 3659 }, { name: 'A', order: 4, id: 3636 } ]