求教一个js递归函数的写法

发布于 2022-09-07 08:59:10 字数 786 浏览 17 评论 0

工作中一个递归写不出,求高手帮忙,采纳有打赏,谢谢,Thanks♪(・ω・)ノ
有如下一段数据

[{
  id: '1',
  name: '姓名1',
  items: [
    {
      id: '2',
      name: '姓名2',
      items: [
        {
          id: '3',
          name: '姓名3',
          items: [
            {
              id: '4',
              name: '姓名4',
            },
          ],
        },
      ],
    },
    {
      id: '5',
      name: '姓名5',
    },
    {
      id: '6',
      name: '姓名6',
    },
  ],
},
{
  id: '7',
  name: '姓名7',
}];

要求有一个函数,传入一个id值,从数据中找到id为传入id的对象,以及这个对象的所有父级对象

比如,传入id为'5',返回

[{id: '5', name: '姓名5'}, {id: '1', name: '姓名1'}]

传入id为'3',返回

[{id: '3', name: '姓名3'}, {id: '2', name: '姓名2'}, {id: '1', name: '姓名1'}]

谢谢大家帮助~~~

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

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

发布评论

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

评论(2

菩提树下叶撕阳。 2022-09-14 08:59:10
let root = {
  id: '1',
  name: '姓名1',
  items: [
    {
      id: '2',
      name: '姓名2',
      items: [
        {
          id: '3',
          name: '姓名3',
          items: [
            {
              id: '4',
              name: '姓名4',
            },
          ],
        },
      ],
    },
    {
      id: '5',
      name: '姓名5',
    },
    {
      id: '6',
      name: '姓名6',
    },
  ],
};

function search(root, id) {
  if(root.id == id) return [ { id: id, name: root.name} ];
  else {
    for(let item of (root.items || [])) {
      let res = search(item, id);
      if(res.length) return [ ...res, { id: root.id, name: root.name } ];
    }
    return [];
  }
}

console.log(search(root, '5'));
console.log(search(root, '3'));

思路和“使用递归实现逆序打印用户输入的字符串”类似,每一层递归返回该层搜索到的路径,空数组代表搜索失败;当该层递归得到下层递归返回的结果后,就把当前节点加入路径中,然后向上层返回。

如果需要搜索的树特别大的话最好是优化一下返回的方式,我这种写法每次都会生成一个新的数组对象,你可以用Array.push把同一个路径传递下去。

鸩远一方 2022-09-14 08:59:10
let root = [{
  id: '1',
  name: '姓名1',
  items: [
    {
      id: '2',
      name: '姓名2',
      items: [
        {
          id: '3',
          name: '姓名3',
          items: [
            {
              id: '4',
              name: '姓名4',
            },
          ],
        },
      ],
    },
    {
      id: '5',
      name: '姓名5',
    },
    {
      id: '6',
      name: '姓名6',
    },
  ],
}];

function search(root, id) {
  for (let i = 0; i < root.length; i += 1) {
    if (root[i].id === id) {
      return [{ id, name: root[i].name }];
    }
  }
  for (let i = 0; i < root.length; i += 1) {
    if (root[i].items && Array.isArray(root[i].items)) {
      const res = search(root[i].items, id);
      if (res.length) return [...res, { id: root[i].id, name: root[i].name }];
    }
  }
}

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