Compare dos matrices de objetos para encontrar valores distintos por todos los valores clave
Así que encontré mucha documentación como Obtener valores únicos comparando objetos de matriz antiguos y nuevos, pero mi caso es un poco más complejo.
En mi caso quiero comparar dos bases de datos de precios, cada semana, averiguar qué precios han cambiado y luego agregarlos solo a la base de datos existente. Te doy un ejemplo:
oldPrices = [{"date": "07-07-2022", "price": 129, "locationId": 1 }, {"date": "08-07-2022", "price": 139, "locationId": 1 }, {"date": "08-07-2022", "price": 139, "locationId": 2 }] newPrices = [{"date": "07-07-2022", "price": 139, "locationId": 1 }, {"date": "08-07-2022", "price": 139, "locationId": 1 }, {"date": "08-07-2022", "price": 139, "locationId": 2 }]Salida esperada para agregar a oldPrices:
[{"date": "07-07-2022", "price": 139, "locationId": 1 }]Lo que he probado hasta ahora:
var data1 = {{(table17.data)}}; var data2 = {{ formatDataAsArray(table18.data) }}; const oldPrices = data1.map (({date, price, locationId}) => ({date, price, locationId})); const newPrices = data2.map (({date, price, locationId}) => ({date, price, locationId})); function getDifference(array1, array2) { return array1.filter(object1 => { return !array2.some(object2 => { return object1.price === object2.price; }); }); } const difference = [ ...getDifference(oldPrices, newPrices), ...getDifference(newPrices, oldPrices) ]; console.log(difference)Resultado = vacío
Solo hay resultado, si los datos de newPrice contienen precios que no se incluyeron en los datos de oldPrices. Esto no tiene sentido, ya que quiero agregar todos los objetos que contienen combinaciones de las 3 claves, que son nuevas (únicas) .
Lo que necesito es que la función no solo verifique el precio de cada objeto, sino también la combinación de fecha, precio y ID de ubicación, de modo que la salida en este caso sea nuevamente [{"fecha": "07-07-2022", " precio": 139, "ubicaciónId": 1 }].
estoy usando lenguaje js
1- Use el método filter() para iterar sobre la primera matriz. 2- Verifique si cada objeto no está contenido en la segunda matriz.
3- Repita los pasos 1 y 2 para la segunda matriz. 4- Concatenar los resultados para obtener la diferencia completa.
No entiendo completamente qué debe contener la matriz de difference . Si desea comparar la matriz newPrices con la matriz oldPrices y devolver solo el objeto que tiene un precio diferente en comparación con su objeto correspondiente (uno con la misma date y locationId ), entonces la siguiente función hará el trabajo:
const oldPrices = [{"date": "07-07-2022", "price": 129, "locationId": 1 }, {"date": "08-07-2022", "price": 139, "locationId": 1 }, {"date": "08-07-2022", "price": 139, "locationId": 2 }]; const newPrices = [{"date": "07-07-2022", "price": 139, "locationId": 1 }, {"date": "08-07-2022", "price": 139, "locationId": 1 }, {"date": "08-07-2022", "price": 139, "locationId": 2 }]; function getDifference(array1, array2) { return array1.filter(object1 => { return array2.find(object2 => { if (object1.date === object2.date && object1.locationId === object2.locationId && object1.price !== object2.price) { return object2 } }) }); } const difference = [ // ...getDifference(oldPrices, newPrices), ...getDifference(newPrices, oldPrices) ]; console.log(difference) Tenga en cuenta que si ejecuta la función getDifference con oldPrices como primer argumento y newPrices como segundo argumento, el resultado no será el mismo.
Espero que esto sea lo que está tratando de lograr, si no es así, explique con más detalle cuál debería ser el resultado y cómo le gustaría lograrlo.
Creo que esta es una buena solución para su problema.
const oldPrices = [ { date: "07-07-2022", price: 129, locationId: 1 }, { date: "08-07-2022", price: 139, locationId: 1 }, { date: "08-07-2022", price: 139, locationId: 2 }, ]; const newPrices = [ { date: "07-07-2022", price: 139, locationId: 1 }, { date: "08-07-2022", price: 139, locationId: 1 }, { date: "08-07-2022", price: 139, locationId: 2 }, ]; let old = oldPrices.map((p) => JSON.stringify(p)); let unique = newPrices.filter((p) => !old.includes(JSON.stringify(p))); console.log(unique);