ts 获取俩个json对象所有不一致的结点
时间: 2024-05-11 07:19:09 浏览: 146
可以通过 TypeScript 中的递归函数来实现获取两个 JSON 对象所有不一致的节点。以下是一个示例代码:
```typescript
function compareJSON(obj1: any, obj2: any, path = ''): string[] {
const diffNodes: string[] = [];
if (typeof obj1 !== typeof obj2) {
diffNodes.push(path);
} else if (Array.isArray(obj1) && Array.isArray(obj2)) {
if (obj1.length !== obj2.length) {
diffNodes.push(path);
} else {
obj1.forEach((item, index) => {
const newPath = `${path}[${index}]`;
const itemDiffNodes = compareJSON(item, obj2[index], newPath);
diffNodes.push(...itemDiffNodes);
});
}
} else if (typeof obj1 === 'object' && typeof obj2 === 'object') {
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
const allKeys = new Set([...keys1, ...keys2]);
allKeys.forEach((key) => {
const newPath = path ? `${path}.${key}` : key;
const itemDiffNodes = compareJSON(obj1[key], obj2[key], newPath);
diffNodes.push(...itemDiffNodes);
});
} else if (obj1 !== obj2) {
diffNodes.push(path);
}
return diffNodes;
}
// 例子
const obj1 = {
name: 'Alice',
age: 30,
hobbies: ['reading', 'swimming'],
address: {
city: 'Beijing',
country: 'China',
},
};
const obj2 = {
name: 'Bob',
age: 30,
hobbies: ['reading', 'gaming'],
address: {
city: 'Shanghai',
country: 'China',
},
};
const diffNodes = compareJSON(obj1, obj2);
console.log(diffNodes); // ["name", "hobbies[1]", "address.city"]
```
在上面的代码中,我们定义了一个名为 `compareJSON` 的函数,它递归比较了两个 JSON 对象的所有节点,并返回所有不一致的节点路径。对于每个节点,我们都会比较它们的类型和值,并根据结果添加到 `diffNodes` 数组中。
在比较对象时,我们还需要考虑数组和对象的情况。对于数组,我们需要比较数组长度和每个元素的值;对于对象,我们需要比较对象键的集合,并递归比较每个键的值。在递归比较时,我们还需要传递当前节点的路径,以便在不一致时能够准确地记录节点路径。
最后,我们可以使用示例代码中的两个 JSON 对象进行测试,并将所有不一致的节点路径打印出来。
阅读全文