假设我有一个像这样的数组

let tree = [
  {
    id: 8,
    level: 1,
    children: [
      {
        id: 3,
        level: 2,
        children: [
          {
            id: 1,
            level: 3,
            children: []
          },
          {
            id: 6,
            level: 3,
            children: [
              { id: 4, level: 4, children: [] },
              { id: 7, level: 4, children: [] }
            ]
          }
        ]
      },
      {
        id: 10,
        level: 2,
        children: [
          {
            id: 14,
            level: 3,
            children: [
              { id: 13, level: 4, children: [] }
            ]
          }
        ]
      }
    ]
  }
]


我正在努力让所有孩子都达到指定水平。因此,在函数中,如果我提供的等级为3,则应该让那里的孩子以及那里的孩子的孩子(如果有的话)出现。

这是我到目前为止的功能。奇怪的是,它适用于第2级,但仅此而已。

function searchTree(node, level){
  let resultArr = [];
  if(node.children){
    node.children.forEach( (n) => {
      if(n.level === level){
        resultArr.push(n);
      }
        searchTree(n, n.level);
    })
  }
  return resultArr;
}

最佳答案

您至少有四个错误:


您没有传递resultArr,因此它无法累积结果。
即使您发现孩子的父母具有搜索级别,您仍会继续看他们的孩子-这是浪费时间。
您正在使用节点的级别而不是要搜索的级别进行递归调用。
您的代码不适用于第一级,因为您从不检查顶层节点,仅检查其子节点。


试试这个版本:

function searchTree(node, level, resultArr)
{
  if (node)
  {
    if (node.level === level)
    {
      resultArr.push(node);
    }
    else if (node.children)
    {
      node.children.forEach((n) => {searchTree(n, level, resultArr);})
    }
  }
}


您也不需要将级别存储在节点中。您可以在进行递归调用时计算它(如果使用currentLevel进行调用,只需使用currentLevel + 1来调用子代)。

10-01 07:22
查看更多