如何根据javascript中的关键属性来获得两个对象数组之间的差异



我有两个这样的对象数组。

Array1=[
{ value: "0", display: "Jamsheer",desc:"maths" },
{ value: "1", display: "Muhammed",desc:"science" },
{ value: "2", display: "Ravi",desc:"english" },
{ value: "3", display: "Ajmal",desc:"english" },
{ value: "4", display: "Ryan",desc:"english" }
}];
array2=[
{ value: "0", display: "Jamsheer",desc:"maths" },
{ value: "1", display: "Muhammed",desc:"science" },
{ value: "2", display: "Ravi varma",desc:"english" },
{ value: "3", display: "Ajmal",desc:"english and tamil" },
{ value: "4", display: "Ryan",desc:"english" }
}];

在这里,我必须根据值比较显示和desc

预期输出:

final_output=[
{ value: "2", display: "Ravi varma",desc:"english" },
{ value: "3", display: "Ajmal",desc:"english and tamil" }
];
const final_output = array2.filter(el => {
const otherEl = Array1.find(x => x.value === el.value);
return el.display !== otherEl.display || el.desc !== otherEl.desc;
});

我看到了两种方法。

由于对象的键是按字母顺序排序的,我们可以比较它们的字符串版本。

const final_output = Array1.reduce((unique, entry) => {
const isDuplicate = array2.some(object =>
JSON.stringify(object) === JSON.stringify(entry)
);
if (!isDuplicate) unique.push(entry);
return unique;
}, []);

或者我们可以迭代地查看它们的每个属性。

const final_output = Array1.reduce((unique, entry) => {
const isDuplicate = array2.some(object =>
Object.keys(object).every(key => object[key] === entry[key])
);
if (!isDuplicate) unique.push(entry);
return unique;
}, []);

一些方法要知道:

  • Array#reduce-将数组缩减为单个结果(在组合操作或出于性能原因链接方法时很有用(
  • Array#every-比较两个数组,并检查所有项的回调是否为true(对于检查精确匹配非常有用,就像我们对对象所做的那样(
  • Array#some-比较两个数组,并检查是否有任何条目的回调为true(对于检查任何匹配都很有用,就像我们对重复项所做的那样(

最新更新