我有两个对象
一个对象是Original Data
const origin = { name: 'John', id: 'Doe', item: { drink: 'coffee', money: 0 } }
另一个对象是Copied and Edited Data
const copied = { name: 'Alex', id: 'Doe', item: { drink: 'water', money: 0 } }
我想比较它们,只得到不同的。
const out = compareObj(origin, copied);
console.log(out)
/*
{ name: 'Alex', item: { drink: 'water' } }
*/
我怎样才能得到这个?
提前感谢。
您可以在对象和delete
上递归地循环copy
对象的不重复属性。
如果在original
对象上存在属性,而在copy
上不存在,则将其添加到copy
对象中。下面的代码是这样做的:
if (!copy.hasOwnProperty(k)) {
copy[k] = v;
}
function compare(original, copy) {
for (let [k, v] of Object.entries(original)) {
if (typeof v === "object" && v !== null) {
if (!copy.hasOwnProperty(k)) {
copy[k] = v;
} else {
compare(v, copy?.[k]);
}
} else {
if (Object.is(v, copy?.[k])) {
delete copy?.[k];
}
}
}
return copy;
}
const
original = { name: "John", id: "Doe", item: { drink: "coffee", money: 0, honey: 24 } },
copy = { name: "Alex", id: "Doe", item: { drink: "water", money: 0 } },
diff = compare(original, JSON.parse(JSON.stringify(copy)));
console.log(diff);
注意:您需要将copy
对象的克隆传递给函数,因为它会改变传递的copy
对象。