我有一个大问题。我想创建一个功能,删除相同的部分'在两个JSON文件之间,函数的输出具有相同的结构,但没有相同的部分'。
示例我有一个DOM树的JSON版本,我想只保留页面之间的差异(删除导航页脚...)
实施例
const a = {
id: '1',
child: [
{
id: '2',
child: [
{
id: '1'
},
{
id: '2'
}
]
},
{
id: '3',
child: [
{
id: '1'
},
{
id: '5'
}
]
}
]
}
和
const b = {
id: '1',
child: [
{
id: '2',
child: [
{
id: '1'
},
{
id: '4'
}
]
},
{
id: '3',
child: [
{
id: '1'
},
{
id: '4'
}
]
}
]
}
使用功能
diff(a, b)
此结果
{
id: '1',
child: [
{
id: '2',
child: [
{
id: '2'
}
]
},
{
id: '3',
child: [
{
id: '5'
}
]
}
]
}
我是基于递归函数
创建的const diff = (a, b) => {
if (Array.isArray(a)) {
}
if (typeof a === 'object') {
// ...
extract(a.child, b.child);
}
}
我该怎么做?有没有npm包?或者使用JSON Path?我想创建一个功能,删除相同的部分'在两个JSON文件之间,函数的输出具有相同的结构,但没有相同的部分'。
答案 0 :(得分:0)
我假设你不能保证id / value对的顺序?
我建议您首先递归合并每个图层,然后检查并删除重复项。
使用递归函数的代码编辑
let c = [] // merged structure
for (var i=0; i<a.length; i++)
{
for (let j=0; j<b.length; j++)
{
if (a[i].id === j[i].id) {
c[i] = { id: a[i].id, child: a[i].child.concat(b[i].child) }
// next, sort the c[i].child, and
// loop through c[i].child and recur over any cases where
// c[i].child[k].id === c[i].child[k+1].id
// at the end, go back up the chain removing any structs where the
// id is a duplicate and has no children left
}
}
}