js实现根据树子节点id查找当前父节点id

const dataSource = [
      {
        id: 1,
        label: 'Level one 1',
        children: [
          {
            id: 4,
            label: 'Level two 1-1',
            children: [
              {
                id: 9,
                label: 'Level three 1-1-1'
              },
              {
                id: 10,
                label: 'Level three 1-1-2'
              }
            ]
          }
        ]
      },
      {
        id: 2,
        label: 'Level one 2',
        children: [
          {
            id: 5,
            label: 'Level two 2-1'
          },
          {
            id: 6,
            label: 'Level two 2-2'
          }
        ]
      },
      {
        id: 3,
        label: 'Level one 3',
        children: [
          {
            id: 7,
            label: 'Level two 3-1'
          },
          {
            id: 8,
            label: 'Level two 3-2'
          }
        ]
      }
    ]
function getParentNodeId(tree, childId) {
  // 遍历树节点
  for (let node of tree) {
    // 如果当前节点就是目标节点的父节点,直接返回当前节点id
    if (node.children && node.children.some(child => child.id === childId)) {
      return node.id;
    }
    // 否则继续遍历当前节点的子节点
    if (node.children) {
      const parentId = getParentNodeId(node.children, childId);
      if (parentId !== null) {
        return parentId;
      }
    }
  }
  // 如果没有找到父节点,则返回null
  return null;
}

// 示例使用
console.log(getParentNodeId(dataSource, 9)); // 输出 4
console.log(getParentNodeId(dataSource, 6)); // 输出 2
console.log(getParentNodeId(dataSource, 3)); // 输出 null

在上面的代码中,tree参数是一个包含树所有节点的数组,每个节点包含idchildren属性,id是节点的唯一标识,children是一个包含子节点的数组,每个子节点包含idlabel属性。childId参数是需要查找其父节点id的目标节点id。

首先遍历整个树,如果当前节点的children属性包含目标节点的id,说明当前节点就是目标节点的父节点,直接返回当前节点的id。否则,继续遍历当前节点的子节点,如果找到目标节点的父节点,则返回其id,否则继续遍历下一个节点。如果最终没有找到父节点,则返回null。在这个例子中,使用了数组的some方法来查找节点的子节点中是否包含指定的子节点id。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值