Skip to content
Advertisement

find out if object in two arrays of objects is unique

Compare two array of objects to find distinct values by all key values

So I found a lot of documentation like Get unique values by comparing old and new array objects but my case is a bit more complex.

In my case I want to compare two databases of prices, every week, finding out which prices have changed and then add only them to the existing database. I give you an example:

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 }]

Expected output to add to oldPrices:

[{"date": "07-07-2022", "price": 139, "locationId": 1 }]

What I have tried so far:

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)

Outcome = empty

There is only outcome, if the newPrice data contains prices, that were not included in the oldPrices data. This makes no sense, since I want to add all the objects containing combinations of the 3 keys, that are new (unique).

What I need is the function not only check the price of every object, but the combination of date, price and locationId, so that the output in this case would again be [{“date”: “07-07-2022”, “price”: 139, “locationId”: 1 }].

Advertisement

Answer

I think this is good solution for your problem

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);
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement