JS forEach 递归中断

本文探讨了在JavaScript中如何在forEach循环中实现中断机制,通过抛出异常的方法解决,并展示了如何在递归函数中应用此技巧进行复杂数据结构的遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时处理数据需要递归,或者遍历,同时需要判定,若是中途满足了一些条件,就退出递归

如下数据:

var node = [
    { name:'a',leaf:false},
    { name:'b',leaf:true,
      children:[
       {name:'b1',leaf:true},
       {name:'b2',leaf:true}
      ],
    },
    { name:'c',leaf:false}
 ];

数组对象.forEach()

 而forEach

可枚举每一个数组元素,但并不支持类似for循环的break语法,中断循环

例如,上面的例子我们使用下

function A() {
    node.forEach((x)=>{
        if(x.leaf) return console.log('终止');
        else console.log(x.name);
    });
}

在控制台里执行:

而如果采用for循环

function B() {
   for(var i=0;i<node.length;i++) {
       var x = node[i];
       if(x.leaf) return console.log('终止');
        else console.log(x.name);
   }
}

在控制台里输出:

 

那问题来了:

又想使用forEach,又想中断咋办?


方法一:.复写forEach方法:

过程:略(自行百度)

方法二:使用抛出异常

try{
    node.forEach((x)=>{
        if(x.leaf) throw '终止'
        else console.log(x.name);
    });
}catch(r) {
    console.log(r)
}
   

那如果想进行稍微复杂点的递归后回调,应该这么处理

function A(a) {
      if(a.leaf) throw a;
    else if(a.children){
        a.children.forEach((x)=>{
            throw A(x);
        })
    } 
}
 
function B(b) {
   b.forEach((x)=>{
         try{
            A(x)
         }catch(r) {
            throw r;
         }
    })
} 
 
function C() {
 try{
    B(node)
 }catch(r) {
    console.log(r)
 }
 
}

然后控制台里执行:

注意:如果把B方法更改了

function B(b) {
   b.forEach((x)=>{
            throw A(x);//直接抛出A
    })
}

控制台里执行 无返回结果

我们再尝试把数据改复杂点

var node = [
    { name:'a',leaf:false},
    { name:'b',leaf:false,
      children:[
       {name:'b1',leaf:false},
       {name:'b2',leaf:false,
           children:[
               {name:'b21',leaf:false},
               {name:'b22',leaf:true,}
            ],
       }
      ],
    },
    { name:'c',leaf:false}
 ];

这是再次执行C()会发现,没有结果抛出

需要改造A方法:

function A(a) {
      if(a.leaf) throw a;
    else if(a.children){
        a.children.forEach((x)=>{
            try{
                 A(x) //递归时调用 也要继续抛出异常
            }catch(r) {
                  throw r;
            }
        })
    } 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

29号同学

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值