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?

4
  • 3
    Possible duplicate of How to merge two arrays in JavaScript and de-duplicate items Commented Jan 13, 2019 at 14:33
  • @TimKlein, I am looking for filtering based on 2 keys. Commented Jan 13, 2019 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). Commented Jan 13, 2019 at 14:37
  • Have you tried anything? Commented Jan 13, 2019 at 14:39

4 Answers 4

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);

Sign up to request clarification or add additional context in comments.

Comments

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);

Comments

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

Comments

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 }));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.