Estoy trabajando para agregar, actualizar o eliminar un objeto anidado de una matriz en función de los objetos de otra matriz. Por ejemplo, me gustaría actualizar la date -> gte en función de la matriz de update , manteniendo la entry -> eq y agregando date -> lte .
Lo intenté con el siguiente fragmento, pero el resultado produce un resultado inflado con claves/valores incorrectos.
const existing = [ { date: { gte: '2021-01-01' } }, { entry: { eq: 1 } }, { keep: { eq: 100 } }, ]; const update = [ { date: { gte: '2021-02-01' } }, { date: { lte: '2021-12-31' } }, ]; const outcome = []; update.forEach((el) => { existing.forEach(elem => { Object.entries(elem).forEach(([k, v]) => { Object.entries(el).forEach(([key, value]) => { if (k === key && Object.keys(v).sort().toString() === Object.keys(value).sort().toString()) { outcome.push(el) } else { outcome.push(elem) } }); }); }) }); console.log(outcome); // expected outcome // [ // { date: { gte: '2021-02-01' } }, // { entry: { eq: 1 }}, // { keep: { eq: 100 } }, // { date: { lte: '2021-12-31' } } // ] // current outcome // [ // { date: { gte: '2021-02-01' } }, // { entry: { eq: 1 } }, // { keep: { eq: 100 } }, // { date: { gte: '2021-01-01' } }, // { entry: { eq: 1 } }, // { keep: { eq: 100 } } // ]Esto debería ser suficiente para su caso (actualizaciones en el lugar):
const existing = [ { date: { gte: '2021-01-01' } }, { entry: { eq: 1 } }, { keep: { eq: 100 } }, ]; const update = [ { date: { gte: '2021-02-01' } }, { date: { lte: '2021-12-31' } }, ]; while (update.length) { const u = update.shift(); const [p, o] = Object.entries(u)[0]; const [k, v] = Object.entries(o)[0]; const f = existing.find(e => p in e && k in e[p]); f ? f[p][k] = v : existing.push(u); } console.log(existing);