[前端笔试题] JS树形结构提取信息,递归思想

要求:输入id为212 ,返回:菜单2/菜单2-1/菜单2-1-2
思路:212 切分为 2、 21 、212,查找对应的text ,递归
解法:直接上代码
// 原目标对象格式为属性
const TreeList = [
  {
    id: 1, parent: null, text: '菜单1', children: [
      { id: 11, parent: 1, text: '菜单1-1' },
      {
        id: 12, parent: 1, text: '菜单1-2', children: [
          { id: 121, parent: 12, text: '菜单1-2-1' },
        ]
      },
    ]
  },
  {
    id: 2, parent: null, text: '菜单2', children: [
      {
        id: 21, parent: 2, text: '菜单2-1', children: [
          { id: 211, parent: 21, text: '菜单2-1-1' },
          { id: 212, parent: 21, text: '菜单2-1-2' },
        ]
      }
    ]
  }
];

// 目标输入:id为212,目标对象TreeList
// 目标输出:菜单2/菜单2-1/菜单2-1-2

function getTreeString(id, tree) {
  // 输入的id为Number格式,为了方便截取,先转换为String格式 
  const _id = id.toString();
  // ids是为了存储截取出来的id,2、21、212
  let ids = []
  // res是为了存储最终的处理结果,
  // 即 '菜单2/菜单2-1/菜单2-1-2'
  let res = '';
  // 先用for循环,依次将截取的id,push到ids数组中存储
  for (let i = 0; i < _id.length; i++) {
    ids.push(_id.slice(0, i + 1))
  };
  // console.log(ids)  // 打印结果为[ '1', '12', '121' ]
  // 第二个for循环,根据ids的每一项属性,对传入的tree进行遍历
  for (let i of ids) {
    // 这里i是ids数组中的每一项,即1、12、121
    // 此处i是String格式,要遍历的tree对象中的id是Number格式,因此先将i转换为Number格式
    idNumber = Number(i);
    // 这里的函数传入tree对象和Number类型的id,利用map函数进行遍历
    function getTreeItem(tree, idNumber) {
      tree.map((item) => {
      // 这里先根据第一层判断,有对应id则将res的内容赋值为tree对象中的text内容
        if (item.id === idNumber) {
          res += `${item.text}/`
          // 外层查询完了之后,再判断是否具有children数组,有则将children数组当作参数
          // 传入getTreeItem函数,进行递归操作
        } else if (item.children) {
          getTreeItem(item.children, idNumber)
        }
      })
    }
    // 这里是函数的独立调用
    getTreeItem(tree, idNumber)
  }
  // 最终return出res,因为res的最后一个字符为/,这里采用slice截取函数,将最后一个字符串去掉
  return res.slice(0, -1)
}
// 最终打印一下结果,返回得到了目标输出
console.log(getTreeString(212, TreeList));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值