JS面试——谈谈你平时项目中的用的递归算法

场景一:处理后端api接口数据

后端返回的接口数据,实现多级遍历,拿到每次层最后一个数据

拿出的数据  青苹果 红苹果 北方米饭 南方米饭 联想电脑 苹果电脑 锄头 锤子  洗发水 沐浴露

var data = [
 {
     name: "所有物品",
     children: [
         {
             name: "水果",
             children: [{name: "苹果", children: [{name: '青苹果'}, {name: '红苹果'}]}]
         },
         {
             name: '主食',
             children: [
                 {name: "米饭", children: [{name: '北方米饭'}, {name: '南方米饭'}]}
             ]
         },
         {
             name: '生活用品',
             children: [
                 {name: "电脑类", children: [{name: '联想电脑'}, {name: '苹果电脑'}]},
                 {name: "工具类", children: [{name: "锄头"}, {name: "锤子"}]},
                 {name: "生活用品", children: [{name: "洗发水"}, {name: "沐浴露"}]}
             ]
         }
  ]
}]

实现思路:

通过判断是否还有children,没有就代表是最后一级了,有就继续把children这个list传给函数继续遍历,最后就得到了我们想要的数据。

 var recursiveFunction = function () {
      var str = ''
      const getStr = function (list) {
        list.forEach(function (row) {
          // row是每一层的对象
          console.log(row);
          if (row.children) {
            // 如果存在row.children说明不是最后一层,调用上面的函数继续向下寻找
            getStr(row.children)
          } else {
            str += row.name + ";"
          }
        })
      }
      getStr(data)
      console.log(str)
    }
    recursiveFunction()

 

 

优点:

递归遍历,理论上,只要内存够用,你能实现任意层级的遍历或者遍历未知层级,但缺点也很明显,没一个层级里面需要有固定的数据格式,否则无法遍历。

场景二:递归实现深拷贝

如下代码,实现对o数组的深拷贝给b,然后修改0中的数据,b的数据不受影响

const o = [1, 2, 3, 4, 5]
    function clone(o) {
      var temp = {}
      for (var key in o) {
        if (typeof o[key] == 'object') {
          temp[key] = clone(o[key])
        } else {
          temp[key] = o[key]
        }
      }
      return temp

    }
    b = clone(o)
    o[1] = 99
    console.log(o, b);

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.指尖舞者

如果帮助到了你,请给点赞助支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值