1

I want to filter data from the JS array and create another JS array. I explained the scenario as below.

There are two JS arrays. they are arr1 and arr2

const arr1 = [
{
  code: "XXY",
  dis: "cont1",
  note: "Note for cont1"
}, 
{
  code: "AAW",
  dis: "cont2",
  note: "Note for cont2"
}, 
{
  code: "TTR",
  dis: "cont5",
  note: "Note for cont5"
}, 
{
  code: "MMN",
  dis: "cont10",
  note: "Note for cont10"
}];
const arr2 = [
{
  code: "XXY",
  dis: "cont1",
  note: "Note for cont1"
}, 
{
  code: "AAW",
  dis: "cont2",
  note: "Note for cont2"
}, 
{
  code: "TTR",
  dis: "cont5",
  note: "Note for cont5"
}, 
{
  code: "MMN",
  dis: "cont10",
  note: "Note for cont10"
}, 
{
  code: "vvg",
  dis: "cont15",
  note: "Note for cont15"
}];

we can do change in arr2[1].dis and arr2[2].note and arr2[4].note. I have mentioned it in below

const arr2 = [
{
  code: "XXY",
  dis: "cont1",
  note: "Note for cont1"
}, 
{
  code: "AAW",
  dis: "cont2 new",
  note: "Note for cont2"
}, 
{
  code: "TTR",
  dis: "cont5",
  note: "New Note for cont5"
}, 
{
  code: "MMN",
  dis: "cont10",
  note: "Note for cont10"
}, 
{
  code: "VVG",
  dis: "cont15",
  note: "Note for cont15 changed"
}];

Once I changed the arr2 I want to compare it with arr1 and create new_arr and push all the changed elements to the new_arr. Compare should be done with code. Because code: "VVG" has a change. But it should not be contained a new array. Because code: "VVG" not in arr1.

Expected-output :

[
  {
    code: "AAW",
    dis: "cont2 new",
    note: "Note for cont2"
  },
  {
    code: "TTR",
    dis: "cont5",
    note: "New Note for cont5"
  }
]

Tried code:

const codesss = new Set(arr1.map(({ code }) => code));
const  new_arr = arr2.filter(({ code }) => !codesss.has(code));

console.log(new_arr);

current output:

[
  {
    "code": "VVG",
    "dis": "cont15",
    "note": "Note for cont15 changed"
  }
]

My current output is not the Expected-output. Please help me to solve this.

2 Answers 2

3

First, using Array.prototype.reduce, you can build new object from arr1 with the code variable as key.

Based on that object, you can filter the objects needed using Array.prototype.filter.

const arr1 = [
{
  code: "XXY",
  dis: "cont1",
  note: "Note for cont1"
}, 
{
  code: "AAW",
  dis: "cont2",
  note: "Note for cont2"
}, 
{
  code: "TTR",
  dis: "cont5",
  note: "Note for cont5"
}, 
{
  code: "MMN",
  dis: "cont10",
  note: "Note for cont10"
}];

const arr2 = [
{
  code: "XXY",
  dis: "cont1",
  note: "Note for cont1"
}, 
{
  code: "AAW",
  dis: "cont2 new",
  note: "Note for cont2"
}, 
{
  code: "TTR",
  dis: "cont5",
  note: "New Note for cont5"
}, 
{
  code: "MMN",
  dis: "cont10",
  note: "Note for cont10"
}, 
{
  code: "VVG",
  dis: "cont15",
  note: "Note for cont15 changed"
}];

const arr1Obj = arr1.reduce((acc, cur) => {
  acc[cur.code] = cur;
  return acc;
}, {});

const result = arr2.filter((item) => arr1Obj[item.code] && !(arr1Obj[item.code].dis === item.dis && arr1Obj[item.code].note === item.note));
console.log(result);

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

Comments

2

const arr1 = [
{
  code: "XXY",
  dis: "cont1",
  note: "Note for cont1"
}, 
{
  code: "AAW",
  dis: "cont2",
  note: "Note for cont2"
}, 
{
  code: "TTR",
  dis: "cont5",
  note: "Note for cont5"
}, 
{
  code: "MMN",
  dis: "cont10",
  note: "Note for cont10"
}];

const arr2 = [
{
  code: "XXY",
  dis: "cont1",
  note: "Note for cont1"
}, 
{
  code: "AAW",
  dis: "cont2",
  note: "Note for cont2"
}, 
{
  code: "TTR",
  dis: "cont5",
  note: "Note for cont5"
}, 
{
  code: "MMN",
  dis: "cont10",
  note: "Note for cont10"
}, 
{
  code: "vvg",
  dis: "cont15",
  note: "Note for cont15"
}];

const arr2Changed = [
{
  code: "XXY",
  dis: "cont1",
  note: "Note for cont1"
}, 
{
  code: "AAW",
  dis: "cont2 new",
  note: "Note for cont2"
}, 
{
  code: "TTR",
  dis: "cont5",
  note: "New Note for cont5"
}, 
{
  code: "MMN",
  dis: "cont10",
  note: "Note for cont10"
}, 
{
  code: "VVG",
  dis: "cont15",
  note: "Note for cont15 changed"
}];

const arr1Codes = {};
const newArray = [];
arr1.map(i => arr1Codes[i.code] = 1);
arr2Changed.map((item, index) => {
  const arr2Item = arr2[index];
  if (arr1Codes[arr2Item.code] && (arr2Item.dis !== item.dis || arr2Item.note !== item.note)) {
    newArray.push(item);
  }
});

console.log(newArray);

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.