树形数据 查找指定节点的当前父节点

发布于 2022-09-13 00:05:56 字数 1135 浏览 31 评论 0

有以下数据结构,如果id是9,则找出对应的父节点是:

{
      id: 4,
      label: '二级 1-1',
      children: [{
        id: 9,
        label: '三级 1-1-1'
      }, {
        id: 10,
        label: '三级 1-1-2'
      }]
    }

我写了一个函数,输出的不正确,问题在哪里呢



const data = [
  {
    id: 1,
    label: '一级 1',
    children: [{
      id: 4,
      label: '二级 1-1',
      children: [{
        id: 9,
        label: '三级 1-1-1'
      }, {
        id: 10,
        label: '三级 1-1-2'
      }]
    }]
  },
  {
    id: 2,
    label: '一级 2',
    children: [{
      id: 5,
      label: '二级 2-1'
    }, {
      id: 6,
      label: '二级 2-2'
    }]
  },
  {
    id: 3,
    label: '一级 3',
    children: [{
      id: 7,
      label: '二级 3-1'
    }, {
      id: 8,
      label: '二级 3-2'
    }]
  }];

  let parantNode = null
  function findParentNode(arr, id) {
    parantNode = arr;
    for (let i in arr) {
      if (arr[i].id === id) {
        return;
      }
      if (arr[i].children) {
        findParentNode(arr[i].children, id)
      }
    }
    return parantNode;
  }

  console.log(findParentNode(data, 10));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北城孤痞 2022-09-20 00:05:56

递归的核心是返回函数结果,给你改写了下,没用parantNode

function findParentNode(arr, id, parent) {
    for (let item of arr) {
      if (item.id === id) {
        return parent || arr;
      }
      if (item.children) {
        let node = findParentNode(item.children, id, item)
        if(node){
            return node
        }
      }
    }
    return null;
}
宁愿没拥抱 2022-09-20 00:05:56

1楼楼主说的很精确:递归的核心是返回函数结果(多次return但是只需要返回一个正确结果)。

其实递归就像koa的洋葱模型一样:

image.png

返回就代表着响应。从最后一层返回,然后函数只接受第一层的返回值,所以需要把最后一层得到的正确答案return出去,然后通过上一层依此传递正确结果,直至最顶层,最终return出去了target。

// 参考一楼这个答案:
function findParentNode(arr, id, parent) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].id === id) {
      // 找到正确的结果代表最后一层的返回值
      return parent
    }
    if (arr[i].children) {
     
      const target = findParentNode(arr[i].children, id, arr[i])
      if (target) {
         // 返回值给到上一层,以此类推,直到最顶层
        return target
      }
    }
  }
  return null
}

const target = findParentNode(data, 100) || []
const id = (target || {}).id || ''
console.log(id);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文