Supongamos que tengo dos matrices de objetos como,
let oldBookDetails = [ {'name':'Harry pottar','amount':10, is_modified: false}, {'name':'LOTR','amount':20, is_modified: false}, {'name':'dune','amount':15, is_modified: false} ] let newBookDetails = [ {'name':'Harry pottar','amount':15}, {'name':'LOTR','amount':20}, {'name':'HR','amount':15} ] let bookModified = []Quiero crear una nueva matriz de objetos comparando newBookDetails con oldBookDetails,
y verifique si se eliminó algún nombre newDetails, no ingrese en la matriz bookModified,
si se ha cambiado la cantidad, inserte el objeto newBookDetails en bookModified con is_modified: true y si la cantidad de newBookDetails es la misma, inserte en la matriz bookModified con is_modified: false.
Para esto probé como:
newBookDetails.forEach((el) => { oldBookDetails.forEach((ele) => { if(Object.values(el).indexOf(el.name) > -1) { if(el.amount === ele.amount) { bookModified.push(el) }else if(el.amount != ele.amount) { el.is_modified = true bookModified.push(el) } } else if(Object.values(el).indexOf(el.name) === -1) { //this loops as all are not equal....i am stuck from this part. } }) })O/P esperado:
console.log(nuevoLibroDetalles)
[ {'name':'Harry pottar','amount':15, is_modified: true}, {'name':'LOTR','amount':20, is_modified: false}, {'name':'HR','amount':15, is_modified: true} ]Si alguien necesita más información, por favor hágamelo saber.
Puedes hacerlo usando map() y find() :
map() en la segunda matriz e intente encontrar el libro en la primera utilizando el nombre de la propiedad. Si no se encuentra, pase en modificado verdadero , de lo contrario, verifique la cantidad y pase el valor modificado en consecuencia.
let oldBookDetails = [ { 'name': 'Harry pottar', 'amount': 10, is_modified: false }, { 'name': 'LOTR', 'amount': 20, is_modified: false }, { 'name': 'dune', 'amount': 15, is_modified: false } ]; let newBookDetails = [ { 'name': 'Harry pottar', 'amount': 15 }, { 'name': 'LOTR', 'amount': 20 }, { 'name': 'HR', 'amount': 15 } ]; let bookModified = newBookDetails.map((x) => { let foundBook = oldBookDetails.find(old => old.name === x.name); if (foundBook) { if (foundBook.amount !== x.amount) return { ...x, is_modified: true }; else return { ...x, is_modified: false }; } else return { ...x, is_modified: true }; }); console.log(bookModified);Array.map lo ayudará a generar la nueva matriz según sus requisitos.
Lógica
newBookDetails .newBookDetails está presente en oldBookDetailsis_modified como trueis_modified como un valor booleano que compara el precio del libro nuevo y el del libro antiguo.oldBookDetails y verifique los nodos que no están presentes en newBookDetails const oldBookDetails = [ {'name':'Harry pottar','amount':10, is_modified: false}, {'name':'LOTR','amount':20, is_modified: false}, {'name':'dune','amount':15, is_modified: false}]; const newBookDetails = [ {'name':'Harry pottar','amount':15}, {'name':'LOTR','amount':20}, {'name':'HR','amount':15} ]; const bookModified = newBookDetails.map((node) => { const oldBookNode = oldBookDetails.find((item) => item.name === node.name); if (oldBookNode) { return { ...node, is_modified: oldBookNode.amount !== node.amount } } else { return { ...node, is_modified: true }; } }); const removedBooks = oldBookDetails.filter((book) => !newBookDetails.find((node) => node.name === book.name)); console.log(bookModified); console.log(removedBooks);Puedes hacerlo con el siguiente fragmento
newBookDetails.forEach(newBook => { let found = false; oldBookDetails.forEach(oldBook => { if (oldBook.name === newBook.name) { if (oldBook.amount === newBook.amount) { bookModified.push({ 'name': newBook.name, 'amount': newBook.amount, is_modified: false }) } else { bookModified.push({ 'name': newBook.name, 'amount': newBook.amount, is_modified: true }) } found = true; } }) if (!found) { bookModified.push({ 'name': newBook.name, 'amount': newBook.amount, is_modified: true }) } })