0

I have following 2 arrays.

const array1 = [
    {name: "V1", year: "2018", isDefault: false},
    {name: "V2", year: "2018", isDefault: false},
    {name: "V3", year: "2018", isDefault: false},
    {name: "V4", year: "2018", isDefault: false},
    {name: "V1", year: "2019", isDefault: true}
  ];

and

const array2 = [
    {name: "V1", year: "2018", isDefault: false},
    {name: "V2", year: "2018", isDefault: false},
    {name: "V3", year: "2018", isDefault: false},
    {name: "V4", year: "2018", isDefault: false},
    {name: "V1", year: "2020", isDefault: true}
  ];

I want to get a resulting array which has all the items from array1 and array2 but having common items only once based on name and year (Based on combination of 2 keys). I have to get the resulting array as follows:

const array = [
    {name: "V1", year: "2018", isDefault: false},
    {name: "V2", year: "2018", isDefault: false},
    {name: "V3", year: "2018", isDefault: false},
    {name: "V4", year: "2018", isDefault: false},
    {name: "V1", year: "2019", isDefault: true},
    {name: "V1", year: "2020", isDefault: true}
  ];

Please help me how to get this in javascript?

TRomesh
  • 3,786
  • 5
  • 38
  • 61
  • 3
    Possible duplicate of [How to merge two arrays in JavaScript and de-duplicate items](https://stackoverflow.com/questions/1584370/how-to-merge-two-arrays-in-javascript-and-de-duplicate-items) – Tim Klein Jan 13 '19 at 14:33
  • @TimKlein, I am looking for filtering based on 2 keys. – Shreenivasa Desai Jan 13 '19 at 14:35
  • Right, if you look at the answer to that question, in the `unique` method instead of testing for strict equality (`if(a[i] === a[j])`), test for equality of your two keys: `if (a[i].name === a[j].name && a[i].year === a[j].year)`. – Tim Klein Jan 13 '19 at 14:37
  • Have you tried anything? – H77 Jan 13 '19 at 14:39

4 Answers4

3

You can approach this concatenating a filtered version of array2 to array1.

const array1 = [
    {name: "V1", year: "2018", isDefault: false},
    {name: "V2", year: "2018", isDefault: false},
    {name: "V3", year: "2018", isDefault: false},
    {name: "V4", year: "2018", isDefault: false},
    {name: "V1", year: "2019", isDefault: true}
];

const array2 = [
    {name: "V1", year: "2018", isDefault: false},
    {name: "V2", year: "2018", isDefault: false},
    {name: "V3", year: "2018", isDefault: false},
    {name: "V4", year: "2018", isDefault: false},
    {name: "V1", year: "2020", isDefault: true}
];

let res = array1.concat(
    array2.filter(({name, year}) => !array1.some(y => y.name === name && y.year === year))
);

console.log(res);
Shidersz
  • 15,614
  • 2
  • 15
  • 40
1

A simple and quick solution with Array.prototype.filter and Set:

const array1 = [{name: "V1", year: "2018", isDefault: false},{name: "V2", year: "2018", isDefault: false},{name: "V3", year: "2018", isDefault: false},{name: "V4", year: "2018", isDefault: false},{name: "V1", year: "2019", isDefault: true}];

const array2 = [{name: "V1", year: "2018", isDefault: false},{name: "V2", year: "2018", isDefault: false},{name: "V3", year: "2018", isDefault: false},{name: "V4", year: "2018", isDefault: false},{name: "V1", year: "2020", isDefault: true}];

const array = [...array1, ...array2].filter(function({name, year}) {

    const key = `${name}${year}`;

    return !this.has(key) && this.add(key);

}, new Set);


console.log(array);
Leonid Pyrlia
  • 1,240
  • 2
  • 8
  • 12
0

const array1 = [{
    name: "V1",
    year: "2018",
    isDefault: false
  },
  {
    name: "V2",
    year: "2018",
    isDefault: false
  },
  {
    name: "V3",
    year: "2018",
    isDefault: false
  },
  {
    name: "V4",
    year: "2018",
    isDefault: false
  },
  {
    name: "V1",
    year: "2019",
    isDefault: true
  }
];

const array2 = [{
    name: "V1",
    year: "2018",
    isDefault: false
  },
  {
    name: "V2",
    year: "2018",
    isDefault: false
  },
  {
    name: "V3",
    year: "2018",
    isDefault: false
  },
  {
    name: "V4",
    year: "2018",
    isDefault: false
  },
  {
    name: "V1",
    year: "2020",
    isDefault: true
  }
];

for (let i = 0; i < array1.length; i++) {
  for (let j = 0; j < array2.length; j++) {
    if (array1[i].name == array2[j].name && array1[i].year == array2[j].year) {
      array2.splice(j, 1)
    }
  }
}

const array = array1.concat(array2);
console.log(array);

I try to solve your problems, may be can help you

Wicak
  • 361
  • 4
  • 11
0

You can try the below too

const mergeById = (array1,array2) => array1.map(itm => ({ ...array2.find((item) => (item.name === itm.name) && (item.year === itm.year) && item), ...itm }));

Puneet
  • 11
  • 3