删除两个JSON之间的等号键

时间:2017-10-19 19:23:26

标签: javascript json node.js algorithm

我有一个大问题。我想创建一个功能,删除相同的部分'在两个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文件之间,函数的输出具有相同的结构,但没有相同的部分'。

1 个答案:

答案 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
      }
   }
}