Skip to content
Advertisement

Compare two arrays of objects, where objects in each array have different properties

I have two result sets like this:

const resultSet1 =
[
    {
        "id": "1",
        "version": "3",
        "website": "https://xx/version/3",
        "name": Ana,
        "lastName": Ana,
    },
    {
        "id": "2",
        "version": "3",
        "website": "https://xx/version/3",
        "name": Ana,
        "lastName": Ana,
        
    }
]


const resultSet2 =
[
    {
        "id": "1",
        "version": "2",
        "birthday": "24.08.1984",
        "place": "Europe",  

    },
    {
        "id": "2",
        "version": "2",
        "birthday": "24.08.1984",
        "place": "Europe",  
    },
    {
        "id": "1",
        "version": "1",
        "birthday": "24.08.1984",
        "place": "Europe",  
    },
    {
        "id": "2",
        "version": "3",
        "birthday": "24.08.1984",
        "place": "Europe",  
    }
]

I want to compare these two result sets, based on id & version. In my const comparisonSet, I want to have elements from the first result set, whose both id & version are not present in the second result set.

const comparisonSet = 

    [
    {
            "id": "1",
            "version": "3",
            "website": "https://xx/version/3",
            "name": Ana,
            "lastName": Ana,
        }
    ]

How can I achieve this in Javascript?

Any help would be appreciated. Thank you in advance!

Advertisement

Answer

You can use filter to get the desired result.

Overall complexity – O(n * 2)

resultSet1.filter(({ id, version }) =>!resultSet2.find((o) => o.id === id && o.version === version));

const resultSet1 = [{
    id: "1",
    version: "3",
    website: "https://xx/version/3",
    name: "Ana",
    lastName: "Ana",
  },
  {
    id: "2",
    version: "3",
    website: "https://xx/version/3",
    name: "Ana",
    lastName: "Ana",
  },
];

const resultSet2 = [{
    id: "1",
    version: "2",
    birthday: "24.08.1984",
    place: "Europe",
  },
  {
    id: "2",
    version: "2",
    birthday: "24.08.1984",
    place: "Europe",
  },
  {
    id: "1",
    version: "1",
    birthday: "24.08.1984",
    place: "Europe",
  },
  {
    id: "2",
    version: "3",
    birthday: "24.08.1984",
    place: "Europe",
  },
];

const result = resultSet1.filter(
  ({
    id,
    version
  }) =>
  !resultSet2.find((o) => o.id === id && o.version === version)
);

console.log(result);

Though it is not so optimized, so you can also create a dictionary and loop up result in O(1) –

Overall complexity O(n)

const dict = resultSet2.reduce((acc, curr) => {
  const { id, version } = curr;
  acc[`${id}|${version}`] = curr;
  return acc;
}, {});

const result = resultSet1.filter(({ id, version }) => !dict[`${id}|${version}`]);

const resultSet1 = [
  {
    id: "1",
    version: "3",
    website: "https://xx/version/3",
    name: "Ana",
    lastName: "Ana",
  },
  {
    id: "2",
    version: "3",
    website: "https://xx/version/3",
    name: "Ana",
    lastName: "Ana",
  },
];

const resultSet2 = [
  {
    id: "1",
    version: "2",
    birthday: "24.08.1984",
    place: "Europe",
  },
  {
    id: "2",
    version: "2",
    birthday: "24.08.1984",
    place: "Europe",
  },
  {
    id: "1",
    version: "1",
    birthday: "24.08.1984",
    place: "Europe",
  },
  {
    id: "2",
    version: "3",
    birthday: "24.08.1984",
    place: "Europe",
  },
];

const dict = resultSet2.reduce((acc, curr) => {
  const { id, version } = curr;
  acc[`${id}|${version}`] = curr;
  return acc;
}, {});

const result = resultSet1.filter(({ id, version }) => !dict[`${id}|${version}`]);

console.log(result);
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement