帮我写一个对比对象的js方法。 要求:不限数据结构 、不限数据层级、不限不限数据类型、并在后传入的对象中有差异的节点打标
时间: 2023-12-29 13:02:11 浏览: 28
好的,以下是一个实现对象比较的 JavaScript 方法,可满足您的要求:
```javascript
function compareObjects(obj1, obj2, diffNodes) {
// 初始化 diffNodes
if (!diffNodes) {
diffNodes = {};
}
// 比较 obj1 和 obj2 的属性
for (const prop in obj1) {
if (obj1.hasOwnProperty(prop)) {
// 如果 obj2 中不存在该属性,则标记为差异节点
if (!obj2.hasOwnProperty(prop)) {
diffNodes[prop] = true;
} else {
// 如果属性值为对象,则递归比较
if (typeof obj1[prop] === 'object') {
compareObjects(obj1[prop], obj2[prop], diffNodes);
} else {
// 如果属性值不为对象,则比较值
if (obj1[prop] !== obj2[prop]) {
diffNodes[prop] = true;
}
}
}
}
}
// 检查 obj2 中是否有 obj1 没有的属性,标记为差异节点
for (const prop in obj2) {
if (obj2.hasOwnProperty(prop) && !obj1.hasOwnProperty(prop)) {
diffNodes[prop] = true;
}
}
return diffNodes;
}
```
使用示例:
```javascript
const obj1 = {
a: 1,
b: {
c: 2,
d: [3, 4],
},
};
const obj2 = {
a: 1,
b: {
c: 3,
d: [3, 4, 5],
e: 6,
},
};
const diffNodes = compareObjects(obj1, obj2);
console.log(diffNodes);
// 输出:{ 'b.c': true, 'b.d.2': true, 'b.e': true }
```
该方法会比较两个对象的所有属性和属性值,如果在后传入的对象中有差异的节点,则会在 diffNodes 对象中打标记。其中 key 值为差异节点的路径,例如 `b.d.2` 表示 `obj1.b.d` 数组中的第三个元素与 `obj2.b.d` 数组中的第三个元素不相等。