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

工作中一个递归写不出,求高手帮忙,采纳有打赏,谢谢,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'}]

谢谢大家帮助~~~

阅读 2.4k
2 个回答
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把同一个路径传递下去。

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'));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题