Tengo 2 matrices que contienen la misma identificación con un valor diferente (dentro de la selección). Mi objetivo es fusionar ambos para convertirlos en 1 matriz.
Cuando uso un operador de propagación como este:
data = [ ...data.filter( (a) => a.id === newData.id ), newData];Vienen los datos siendo anulados
Primera matriz
[ { id: "A527CFFE", selected: [ { itemId: "A1", text: "Selected 1" } ] } ]Segunda matriz
[ { id: "A527CFFE", selected: [ { itemId: "A2", text: "Selected 2" } ] } ]¿Cómo puedo hacer que ambas matrices se conviertan en 1? el resultado esperado:
[ { id: "A527CFFE", selected: [ { itemId: "A1", text: "Selected 1" }, { itemId: "A2", text: "Selected 1" } ] } ]¿Qué estoy haciendo mal en lo anterior?
Puede usar Array.reduce() para combinar las dos matrices en una.
Empezamos concatenando y luego agrupando por id. Para cada elemento con los mismos identificadores, combinamos las matrices selected .
const arr1 = [ { id: "A527CFFE", selected: [ { itemId: "A1", text: "Selected 1" } ] } ] const arr2 = [ { id: "A527CFFE", selected: [ { itemId: "A2", text: "Selected 2" } ] } ] const result = Object.values([...arr1, ...arr2].reduce((acc, { id, selected }) => { acc[id] = acc[id] || { id, selected: [] }; acc[id].selected = [...acc[id].selected, ...selected]; return acc; }, {})); console.log('Result:', result); .as-console-wrapper { max-height: 100% !important; } const arrA=[{id:"A527CFFE",selected:[{itemId:"A1",text:"Selected 1"}]}] const arrB=[{id:"A527CFFE",selected:[{itemId:"A2",text:"Selected 2"}]}] const res = arrA.map(e => { // map all items of first array const found = arrB.find(x => x.id === e.id) // find item in second array with same id return found // check if item has been found in second array ? {id: e.id, selected: [...e.selected, ...found.selected]} // if yes, merged selected : e // if no, return only item from first array }) console.log(res) .as-console-wrapper { max-height: 100% !important; top: 0; } /* ignore this */