Digamos que tengo dos objetos de matrices:
const newObj = { description: "abcd", type: "anything", list: [ { id: 1, name: "Peter" }, { id: 2, name: "Cathenna" }, { id: 3, name: "Chiyo" } ] } const oldObj = { description: "wwew", type: "anything", list: [ { id: 1, name: "Amara" }, { id: 2, name: "shinzo" }, { id: 3, name: "Chiyo" } ] }Quiero encontrar todos los datos actualizados en objetos newObj. Por ejemplo, la descripción de oldObj se actualiza a "abcd" en newObj y en la lista se ha actualizado el nombre de dos objetos. Entonces, mi salida esperada es:
const extractObjDiff = { description: "abcd", list: [ { id: 1, name: "Peter" }, { id: 2, name: "Cathenna" } ] }Probé el siguiente código pero no funciona para la lista de matrices.
function extractObjDiff(newObj, oldObj) { var r = {}; for (var prop in newObj) { if (!oldObj.hasOwnProperty(prop)) { if (Array.isArray(newObj)) { r = newObj; } else { r[prop] = newObj[prop]; } } else if (newObj[prop] === Object(newObj[prop])) { var difference = newObj[prop].length !== oldObj[prop].length ? newObj[prop] : extractObjDiff(newObj[prop], oldObj[prop], []); if (Object.keys(difference).length > 0) r[prop] = difference; } else if (newObj[prop] !== oldObj[prop]) { if (newObj[prop] === undefined) r[prop] = 'undefined'; if (newObj[prop] === null) r[prop] = null; else if (typeof newObj[prop] === 'function') r[prop] = 'function'; else if (typeof newObj[prop] === 'object') r[prop] = 'object' else if (Array.isArray(newObj)) r = newObj; else r[prop] = newObj[prop]; } } return r; }He agregado 2 funciones, la primera da el resultado esperado y la segunda da todos los cambios en el nuevo objeto.
const newObj = { description: "abcd", type: "anything", list: [ { id: 1, name: "Peter" }, { id: 2, name: "Cathenna" }, { id: 3, name: "Chiyo" } ] }; const oldObj = { description: "wwew", type: "anything", list: [ { id: 1, name: "Amara" }, { id: 2, name: "shinzo" }, { id: 3, name: "Chiyo" } ] }; const findSubChanges = (oldObj, newObj) => { let changes=[] for (const i in oldObj) { if (oldObj[i] instanceof Object) { let isChange=false for (const j in oldObj[i]){ if(oldObj[i][j] !== newObj[i][j]){ isChange=true break } } if (isChange){ changes[i] = newObj[i] } } else { if (oldObj[i] !== newObj[i]) { changes[i] = newObj[i]; } } } return changes }; const findChanges = (oldObj, newObj) => { let changes={} for (const i in oldObj) { if (oldObj[i] instanceof Object) { const change = findSubChanges(oldObj[i], newObj[i]); if (change) { changes[i] = change } } else { if (oldObj[i] !== newObj[i]) { changes[i] = newObj[i]; } } } return changes }; const extractObjDiff=findChanges(oldObj, newObj) console.log(extractObjDiff); const newObj = { description: "abcd", type: "anything", list: [ { id: 1, name: "Peter" }, { id: 2, name: "Cathenna" }, { id: 3, name: "Chiyo" } ] }; const oldObj = { description: "wwew", type: "anything", list: [ { id: 1, name: "Amara" }, { id: 2, name: "shinzo" }, { id: 3, name: "Chiyo" } ] }; const isArray = (item) => item instanceof Array; const isJSONObject = (item) => item instanceof Object && !(item instanceof Array); const findEveryChanges = (oldObj, newObj) => { if ( (isArray(oldObj) && isArray(newObj)) || (isJSONObject(oldObj) && isJSONObject(newObj)) ) { let changes = isArray(oldObj) ? [] : {}; for (const i in oldObj) { if (oldObj[i] instanceof Object) { const change = findEveryChanges(oldObj[i], newObj[i]); if (change) { changes[i] = change; } } else { if (oldObj[i] !== newObj[i]) { changes[i] = newObj[i]; } } } if (Object.keys(changes).length > 0) { return changes; } return; } if (oldObj !== newObj) { return newObj; } return; }; console.log(findEveryChanges(oldObj, newObj));