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

734 阅读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));      if(item.meta){        item1.meta = Object.assign({}, item.meta, cmpMap.get(item.path).meta)      };      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);