帮我写一个对比对象的js方法。 要求:不限数据结构 、不限数据层级、不限不限数据类型、并在有差异的节点打标
时间: 2023-12-29 07:02:11 浏览: 23
好的,我可以帮你编写一个比较对象的JS方法,具体实现如下:
```javascript
function compareObjects(obj1, obj2, path = []) {
// 如果两个对象类型不同,则直接返回
if (typeof obj1 !== typeof obj2) {
return [{ path, value1: obj1, value2: obj2 }];
}
// 如果两个对象都是null或undefined,则直接返回
if ((!obj1 && obj2) || (obj1 && !obj2)) {
return [{ path, value1: obj1, value2: obj2 }];
}
// 如果两个对象都是基本类型,则直接比较
if (typeof obj1 !== 'object') {
if (obj1 !== obj2) {
return [{ path, value1: obj1, value2: obj2 }];
} else {
return [];
}
}
// 如果两个对象都是数组,则递归比较数组元素
if (Array.isArray(obj1)) {
const diff = [];
for (let i = 0; i < obj1.length || i < obj2.length; i++) {
const newPath = [...path, i];
const subDiff = compareObjects(obj1[i], obj2[i], newPath);
diff.push(...subDiff);
}
return diff;
}
// 如果两个对象都是对象,则递归比较对象属性
const diff = [];
const keys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]);
for (const key of keys) {
const newPath = [...path, key];
const subDiff = compareObjects(obj1[key], obj2[key], newPath);
diff.push(...subDiff);
}
return diff;
}
```
这个方法接受两个参数 `obj1` 和 `obj2`,分别表示要比较的两个对象。`path` 参数用于记录当前比较的对象在整个对象树中的位置,方便在有差异的节点打标。
这个方法首先判断两个对象的类型。如果类型不同,则直接返回一个差异对象,其中包括差异节点的路径和值。如果两个对象都是 null 或 undefined,则直接返回一个差异对象。
如果两个对象都是基本类型,则直接比较两个值是否相等。如果不相等,则返回一个差异对象。
如果两个对象都是数组,则递归比较数组元素。如果两个数组的长度不同,则返回一个差异对象。如果数组元素有差异,则返回一个包含所有差异元素的差异对象数组。
如果两个对象都是对象,则递归比较对象属性。如果两个对象的属性个数不同,则返回一个差异对象。如果对象属性有差异,则返回一个包含所有差异属性的差异对象数组。
在有差异的节点打标可以根据返回的差异对象数组进行处理。比如可以在差异节点的路径上加上特殊的标记,或者将差异节点的值标记出来。