JS查找树上某个节点的父节点 兄弟节点 以及子节点

1.获取某个节点的所有父节点:

getAllParentNodes(list, id) {
  for(let i in list) {
    if(list[i].resourcesId === id) {
      return [list[i]].filter(v => v.resourcesId !== id)
    }
    if(list[i].children?.length > 0) {
      let node = this.getAllParentNodes(list[i].children, id)
      if(node) return node.concat(list[i]).filter(v => v.resourcesId !== id)
    }
  }
},

2.获取某个节点的兄弟节点:

getBrotherNodes(list, id) {
  for(let i in list) {
    if(list[i].resourcesId === id) {
      return list.filter(v => v.resourcesId !== id)
    }
    if(list[i].children?.length > 0) {
      let node = this.getBrotherNodes(list[i].children, id)
      if(node) return node.filter(v => v.resourcesId !== id)
    }
  }
},

3.获取某个节点的所有子节点:

getAllChildrenNodes(list, id, arr = []) {
  for(let i in list) {
    if(list[i].resourcesId === id) {
      arr.push(list[i])
      if(list[i].children?.length > 0) {
        this.getChild(list[i].children, arr)
      }
    }else {
      if(list[i].children?.length > 0) {
        this.getAllChildrenNodes(list[i].children, id, arr)
      }
    }
  }
  return arr.filter(v => v.resourcesId !== id)
},
getChild(list,  arr) {
  list.forEach(v => {
    arr.push(v)
    if(v.children) {
      getChild(v.children, arr)
    }
  })
},

4.根据id查找节点

  // 根据id查找节点
     findNodeById (nodes, id, idName = 'setKey', childrenName = 'children') {
      for (const node of nodes) {
        console.log(node)
        if (node[idName] === id) {
          return node
        }
        if (node[childrenName]) {
          const foundNode = this.findNodeById(node.children, id, idName, childrenName)
          if (foundNode) {
            return foundNode
          }
    }
  }
  return null
},

5.数据:

let list = [
  {
    label: '最外层1',
    resourcesId: '1',
    children: [
      {
        label: '第二层1',
        resourcesId: '1-1',
        children: [
          {
            label: '第三层1',
            resourcesId: '1-1-1',
            children: [
              {
                label: '第四层1',
                resourcesId: '1-1-1-1'
              },{
                label: '第四层2',
                resourcesId: '1-1-1-2'
              }
            ]
          },{
            label: '第三层2',
            resourcesId: '1-1-2'
          },{
            label: '第三层3',
            resourcesId: '1-1-3'
          }
        ]
      },{
        label: '第二层2',
        resourcesId: '1-2'
      }
    ]
  }
]

6.运行结果:
以 resourcesId 为 ‘1-1’ label 为 ‘第二层1’ 的为例

let a = getAllChildrenNodes(list, '1-1')   //子节点
let b = getAllParentNodes(list, '1-1')  //父节点
let c = getBrotherNodes(list, '1-1')  //兄弟节点
console.log(a);
console.log(b);
console.log(c);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值