树节点筛选方法

220 阅读1分钟

根据树的子节点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
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