JS 两树交集

求两个树形结构的交集

思路是遍历递归第一棵树,在遍历内部再次遍历递归第二棵树,添加层级,用层级和id进行比较,如果相等就添加不用删除的标记

然后在下面在遍历递归tree2,删除没有exist的节点,完成

const tree1 = [
  {
    id: 1,
    name: 'aaa',
  },
  {
    id: 2,
    name: 'bbb',
    children: [
      {
        id: 3,
        name: 'ccc'
      },
      {
        id: 4,
        name: 'ddd'
      }
    ]
  },
  {
    id: 5,
    name: 'eee',
    children: [
      {
        id: 6,
        name: 'fff'
      },
      {
        id: 7,
        name: 'ggg',
        children: [
          {
            id: 8,
            name: 'hhh',
          },
          {
            id: 9,
            name: 'iii',
          }
        ]
      }
    ]
  },
]

const tree2 = [
  {
    id: 1,
    name: 'aaa',
  },
  {
    id: 2,
    name: 'bbb',
    children: [
      {
        id: 3,
        name: 'ccc'
      },
      {
        id: 44,
        name: 'jjj'
      }
    ]
  },
  {
    id: 5,
    name: 'eee',
    children: [
      {
        id: 6,
        name: 'fff'
      },
      {
        id: 7,
        name: 'ggg',
        children: [
          {
            id: 100,
            name: 'zzz'
          },
          {
            id: 8,
            name: 'hhh',
          },
          {
            id: 99,
            name: 'kkk',
          }
        ]
      }
    ]
  },
]

/**
 * 递归遍历树节点
 * @param {*} nodes 树节点数据
 */
function f (nodes = [], nodes2 = [], level = 0, level2 = 0) {
  level++
  nodes.forEach((node) => {
    node.level = level
    // console.log(node);

    // 循环遍历tree2
    function f2 (nodes2 = [], level2 = 0) {
      // console.log("nodes2: ", nodes2);
      level2++
      nodes2.forEach((node2) => {
        node2.level = level2
        // console.log(node2);

        if (node.level === node2.level && node.id === node2.id) {
          node2.exist = true
        }

        var mapNode2 = new Map()
        for (var k2 in node2) {
          mapNode2.set(k2, node2[k2])
        }
        if (mapNode2.has("children")) f2(mapNode2.get("children"), level2)
      })
    }
    f2(nodes2)

    var mapNode = new Map()
    for (var k in node) {
      mapNode.set(k, node[k])
    }
    if (mapNode.has("children")) f(mapNode.get("children"), nodes2, level)
  })
}

f(tree1, tree2)

function filterFn (nodes = []) {
  for (let i = nodes.length - 1; i >= 0; i--) {
    var mapNode = new Map()
    for (var k in nodes[i]) {
      mapNode.set(k, nodes[i][k])
    }
    if (!mapNode.has("exist")) {
      nodes.splice(i, 1)
    }

    if (mapNode.has("children")) filterFn(mapNode.get("children"))
  }
}

filterFn(tree2)
// 两树交集如下结果
console.log(tree2);

emm,不会写,就写成这样了,有大佬会写的帮忙看看有没有其他的写法~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码小余の博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值