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'
          }
        ]
      }
    ]
/**
 * 根据树子节点ID查找所有父节点ID
 * @param {array} dataSource 树形结构数据源
 * @param {number} nodeId 子节点ID
 * @returns {array} 包含所有父节点ID的数组,按照从根节点到直接父节点的顺序排序
 */
function findParentIds(dataSource, nodeId) {
  const parentIds = []; // 用于存储所有父节点ID的数组

  // 定义一个递归函数,用于遍历整棵树并查找子节点的所有父节点
  function traverse(node, nodeId) {
    if (node.id === nodeId) { // 如果当前节点的ID等于子节点的ID,则表示已经找到了子节点,可以开始向上查找父节点
      return true; // 返回true表示已经找到了子节点
    }

    if (node.children) { // 如果当前节点有子节点,则继续遍历子节点
      for (const childNode of node.children) {
        if (traverse(childNode, nodeId)) { // 如果在子节点中找到了子节点的父节点,则将当前节点的ID添加到父节点ID数组中,并返回true表示已经找到了子节点
          parentIds.push(node.id);
          return true;
        }
      }
    }

    return false; // 如果当前节点不是子节点的父节点,则返回false
  }

  // 从根节点开始遍历整棵树,并调用递归函数查找子节点的所有父节点
  for (const node of dataSource) {
    if (traverse(node, nodeId)) { // 如果在当前节点的子树中找到了子节点的父节点,则直接退出循环
      break;
    }
  }

  return parentIds; // 返回所有父节点ID的数组
}


const parentIds = findParentIds(dataSource, 10);
console.log(parentIds); // [4, 1]

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值