在需要递归遍历嵌套数据结构并对每个元素执行操作的情况下,您可以使用递归和forEach 的组合。但是,在某些情况下,您可能需要提前退出 forEach 循环。
与带有 break 或 continue 语句的常规循环不同,forEach 缺乏停止迭代的内置机制。为了模拟这种行为,让我们探索三种方法:
1。 “丑陋”的方式:使用上下文布尔值
将第二个参数传递给 forEach 作为上下文,并在其中存储一个布尔值。在回调函数内,检查布尔值并在必要时进行中断。这种方法在视觉上没有吸引力。
function recurs(comment) {
var stop = false;
comment.comments.forEach(function (elem) {
recurs(elem);
if (...) stop = true;
}, stop);
}
2. “有争议的”方式:异常处理
将 forEach 循环包含在 try-catch 块中。当你想中断时,抛出一个异常并在循环外捕获它。这种方法会影响性能,并可能引起对代码可读性的担忧。
try {
comment.comments.forEach(function (elem) {
recurs(elem);
if (...) throw new Error("Stop Iteration");
});
} catch (e) {
if (e.message === "Stop Iteration") return;
}
3. “有趣”的方式:使用 every()
every() 是一个更好的选择。它继续迭代集合,直到回调函数返回 false。这实际上充当了一个break语句。
comment.comments.every(function (elem) {
recurs(elem);
if (...) return false;
return true;
});
如果您希望返回 true 来中断,也可以使用 some() 代替 every()。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3