Как отфильтровать данные из массива JS и создать другой массив JS

#javascript

#javascript

Вопрос:

Я хочу отфильтровать данные из массива JS и создать другой массив JS. Я объяснил сценарий, как показано ниже.

Существует два массива JS. они arr1 и 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"
}];
  

мы можем внести изменения в arr2[1].dis и arr2[2].note и arr2[4].note . Я упоминал об этом ниже

 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"
}];
  

Как только я изменил arr2 , я хочу сравнить его с arr1 и создать new_arr и перенести все измененные элементы в new_arr . Сравнение должно быть выполнено с. code Потому code: "VVG" что есть изменения. Но он не должен содержать новый массив. Потому code: "VVG" что не в arr1 .

 Expected-output :

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

Пробный код:

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

console.log(new_arr);
  

текущий вывод:

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

Мой current output не тот Expected-output . Пожалуйста, помогите мне решить эту проблему.

Ответ №1:

Во-первых, используя Array.prototype.reduce , вы можете создать новый объект из arr1 code переменной as key .

На основе этого объекта вы можете отфильтровать необходимые объекты с помощью 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] amp;amp; !(arr1Obj[item.code].dis === item.dis amp;amp; arr1Obj[item.code].note === item.note));
console.log(result);  

Ответ №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] amp;amp; (arr2Item.dis !== item.dis || arr2Item.note !== item.note)) {
    newArray.push(item);
  }
});

console.log(newArray);