快速比较两个树形结构数组方法

469 阅读1分钟
const treeData1 = [  {    title: '0-0',    key: '0-0',    children: [      {        title: '0-0-0',        key: '0-0-0',        children: [          { title: '0-0-0-0', key: '0-0-0-0' },          { title: '0-0-0-1', key: '0-0-0-1' },          { title: '0-0-0-2', key: '0-0-0-2' },        ],
      },
      {
        title: '0-0-1',
        key: '0-0-1',
        children: [
          { title: '0-0-1-0', key: '0-0-1-0' },
          { title: '0-0-1-1', key: '0-0-1-1' },
          { title: '0-0-1-2', key: '0-0-1-2' },
        ],
      },
      {
        title: '0-0-2',
        key: '0-0-2',
      },
    ],
  },
  {
    title: '0-1',
    key: '0-1',
    children: [
      { title: '0-1-0-0', key: '0-1-0-0' },
      { title: '0-1-0-1', key: '0-1-0-1' },
      { title: '0-1-0-2', key: '0-1-0-2' },
    ],
  },
  {
    title: '0-2',
    key: '0-2',
  },
];
const treeData2 =[  {    title: '0-0',    key: '0-0',    children: [      {        title: '0-0-0',        key: '0-0-0',        children: [          { title: '0-0-0-0', key: '0-0-0-0' },          { title: '0-0-0-1', key: '0-0-0-1' },          { title: '0-0-0-2', key: '0-0-0-2' },        ],
      },
      {
        title: '0-0-1',
        key: '0-0-1',
        children: [
          { title: '0-0-1-0', key: '0-0-1-0' },
          { title: '0-0-1-1', key: '0-0-1-1' },
          { title: '0-0-1-2', key: '0-0-1-2' },
        ],
      },
      {
        title: '0-0-2',
        key: '0-0-2',
      },
    ],
  },
  {
    title: '0-1',
    key: '0-1',
    children: [
      { title: '0-1-0-0', key: '0-1-0-0' },
      { title: '0-1-0-1', key: '0-1-0-1' },
      { title: '0-1-0-2', key: '0-1-0-2' },
    ],
  },
  {
    title: '0-2',
    key: '0-2',
  },
];
问:如何快速比较两个树形结构数组,并取出交集?
答:new Map()+递归
方法如下:
function recursive (data, cmp, children) {
   const cmpMap = new Map();
   const dataMap = new Map();
   cmp.forEach(item => {
      cmpMap.set(item.path, item);
   });
   data.forEach(item => {
      dataMap.set(item.path, item);
   });  
   data.forEach(item => {
      if (cmpMap.has(item.path)) {
      const item1 = Object.assign({}, item, cmpMap.get(item.path)); 
      children.push(item1);
      const arry1 = dataMap.get(item1.path).children;
      const arry2 = cmpMap.get(item1.path).children;
      item1.children = [];
      if (arry1 && arry2) {
        recursive(arry1, arry2, item1.children); 
      }; 
    }; 
  });
 };
const array = [];
recursive(treeData1, treeData2, array);