Supongamos que tengo dos matrices de Objeto 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 Object comparando newBookDetails con oldBookDetails,

Y compruebe si se elimina algún nombre newDetails, no empuje 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, empuje 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 (newBookDetails)

[
    {'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, hágamelo saber.

0
Sushant Rad 5 oct. 2021 a las 11:18

4 respuestas

La mejor respuesta

Puedes hacerlo usando map() y find():

map () en la segunda matriz e intenta buscar el libro en la primera usando el nombre de la propiedad. Si no se encuentra, pase en verdadero modificado; 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);
2
Nitheesh 5 oct. 2021 a las 09:46

Array.map lo ayudará a generar la nueva matriz según sus requisitos.

Lógica

  • Recorre la matriz newBookDetails.
  • Compruebe si el nodo de newBookDetails está presente en oldBookDetails
  • Si no, devuelve el nodo newBook ​​con is_modified como true
  • En caso afirmativo. devuelve el nodo con el valor is_modified como un valor booleano que compara el precio del libro nuevo y el del libro antiguo.
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 };
  }
});
console.log(bookModified);
1
Nitheesh 5 oct. 2021 a las 09:05

Puede 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
    })
  }
})
-1
Shravan Kumar 5 oct. 2021 a las 08:38
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 = oldBookDetails
  .filter((oldBookDetail) => newBookDetails.findIndex((bookDetails) => bookDetails.name === oldBookDetail.name) > -1)
  .map((oldBookDetails) => {
  const newDetails = newBookDetails.find((bookDetails) => bookDetails.name === oldBookDetails);
  return {...oldBookDetails, ...newDetails};
});

console.log(bookModified);

Sin embargo, podría hacerse mejor si dedica más tiempo a optimizar y afilar

-1
Abror Abdullaev 5 oct. 2021 a las 08:38