1

I've 2 Objects with data that is repeated but also varies. How to compare them and get the differences?

const obj1 = {
  surname: "kowalski",
  name: "adam",
  age: 23,
  city: "Wroclaw",
  country: "Poland",
};

const obj2 = {
  name: "adam",
  age: 34,
  city: "Warszawa",
  country: "Poland",
  friend: "Ala",
};

const objCombined = { ...obj1, ...obj2 };

I've to use .reduce.

My work:

const find = Object.entries(objCombined).reduce((diff, [key]) => {
  if (!obj2[key]) return diff;

  if (obj1[key] !== obj2[key]) diff[key] = obj2[key];

  return diff;
}, {});

but the output is without surname: "kowalski". Expected output:

{surname: "kowalski", age: 34, city: "Warszawa", friend: "Ala"}
kozdro
  • 113
  • 2
  • 8
  • Does this answer your question? [Generic deep diff between two objects](https://stackoverflow.com/questions/8572826/generic-deep-diff-between-two-objects) – pilchard Aug 13 '21 at 14:33

3 Answers3

2

Please use this code

const find = Object.entries(objCombined).reduce((diff, [key]) => {
  if (!obj2[key]) {
    diff[key] = obj1[key];
    return diff;
  }

  if (obj1[key] !== obj2[key]) diff[key] = obj2[key];

  return diff;
}, {});
Kirill Savik
  • 1,228
  • 4
  • 7
2

Remove if (!obj2[key]) return diff and add obj1[key]; if obj2[key]; is undefined:

const obj1 = {
  surname: "kowalski",
  name: "adam",
  age: 23,
  city: "Wroclaw",
  country: "Poland",
};

const obj2 = {
  name: "adam",
  age: 34,
  city: "Warszawa",
  country: "Poland",
  friend: "Ala",
};

const objCombined = { ...obj1, ...obj2 };

const find = Object.entries(objCombined).reduce((diff, [key]) => {
//  if (!obj2[key]) return diff;

  if (obj1[key] !== obj2[key]) diff[key] = obj2[key] || obj1[key];

  return diff;
}, {});

console.log(find);
vanowm
  • 9,466
  • 2
  • 21
  • 37
1

We can use Object.keys() and Array.reduce() to get the difference between the two objects:

const obj1 = { surname: "kowalski", name: "adam", age: 23, city: "Wroclaw", country: "Poland", };
const obj2 = { name: "adam", age: 34, city: "Warszawa", country: "Poland", friend: "Ala", };

const diff = [...Object.keys(obj1), ...Object.keys(obj2)].reduce((acc, key) => { 
    if (obj1[key] !== obj2[key]) {
       acc[key] = obj2[key] || obj1[key];
    }
    return acc;
}, {})

console.log("Diff:", diff);
Terry Lennox
  • 29,471
  • 5
  • 28
  • 40