tengo dos conjuntos de objetos como los siguientes, estoy tratando de comparar dos conjuntos y buscando actualizar el valor total del objeto de arr1 si la identificación coincide con arr2.
const arr1 = [ { id: 1, value: { total: 0 }, }, { id: 2, value: { total: 0 }, }, { id: 3, value: { total: 0 }, }, id: 4, value: { total: 0 }, }, ]; const arr2 = [ { id: 2, value: 3 , }, { id: 3, value: 5, }, ];Estoy tratando de comparar dos matrices y buscando actualizar el valor total del objeto de arr1 si la identificación coincide con arr2
el resultado esperado es
const arr1 = [ { id: 1, value: { total: 0 }, }, { id: 2, value: { total: 3 }, }, { id: 3, value: { total: 5 }, }, { id: 4, value: { total: 0 }, }, ];He probado el siguiente código,
arr1.map((item) => { arr2.find((element) => { if (element.id === item.id ) { item = { ...item, value: { ...item.value, total: item.value.total + element.value, }, }; console.log(item); } }); return item; });Cambié la función de búsqueda a la función de filtro y agregaré el resultado a la matriz original.
prueba esto
const arr1 = [ { id: 1, value: { total: 0 }, }, { id: 2, value: { total: 0 }, }, { id: 3, value: { total: 0 }, }, { id: 4, value: { total: 0 }, } ] const arr2 = [ { id: 2, value: 3 , }, { id: 3, value: 5, }, ]; arr1.map((item) => { let result = arr2.filter((element) => element.id == item.id) if(result && result.length) { item.value.total += result[0].value } return item; }); console.log(arr1)Tienes que asignar un mapa a tu matriz:
this.arr1 = this.arr1.map((item) => { this.arr2.find((element) => { if (element.id === item.id) { item = { ...item, value: { ...item.value, total: item.value.total + element.value, }, }; console.log(item); } }); return item; });Si la id de cada objeto es única (dentro de cada matriz), puede hacer:
arr1.forEach((obj1) => { const obj2Match = arr2.find((obj2) => obj1.id === obj2.id ); if (obj2Match) { obj1.value.total += obj2Match.value; } }); Si más de un objeto puede tener la misma id (por ejemplo, arr2 tiene dos objetos que tienen la id de 2), entonces puede hacer lo siguiente:
arr1.forEach((obj1) => { const obj2Matches = arr2.filter((obj2) => obj1.id === obj2.id ); if (obj2Matches.length) { obj1.value.total += obj2Matches.reduce(((accum, curr) => accum + curr.value), 0); } });Complejidad: