递归函数中断
Recursive function break
下面的代码通过树进行订单后遍历。其目的是在调用方法在特定条件下返回false时中断递归(请参见下面的_walkTree()
)。
function _walkPostOrder(tree, callback, ctx){
var continueWalk = true;
function _walk(tree, callback, ctx, parent){
for(var idx = 0, length = tree.length; idx < length; idx++){
console.log(continueWalk);
if(continueWalk) {
var node = tree[idx];
if(node.children && node.children.length > 0 && continueWalk)
_walk.call(this, node.children, callback, ctx, node);
continueWalk = callback.call(ctx, node, parent, tree, idx);
continue;
};
console.log(node);
break;
};
}
_walk(tree, callback, ctx);
}
var json = [{ text: "root", children: [
{id: "id_1", text: "node_1", children:[
{id: "id_c1", text: "node_c1"},
{id: "id_c2", text: "node_c2", children: [
{id: "id_c2_c1", text: "node_c2_c1"},
{id: "id_c2_c2", text: "node_c2_c2"},
{id: "id_c2_c3", text: "node_c2_c3"}]},
{id: "id_c3", text: "node_c3"}]},
{id: "id_2", text: "node_2"}]}];
//Iterate
(function _walkTree(){
_walkPostOrder.call(this, json, function(node, parentNode, siblings, idx){
console.log(node.id);
if(node.id == "id_c2_c2") return false;
return true;
}, this);
})();
我遇到的问题是,为什么continueWalk
标志在回调设置为false
后返回到true
。其意图是,它应该在这一点上打破循环,以及上面递归函数中的所有循环。
这个小提琴演示应该清楚地表明:https://jsfiddle.net/xuxuq172/2/
您在此处覆盖continueWalk
:
if(node.children && node.children.length > 0 && continueWalk)
_walk.call(this, node.children, callback, ctx, node);
continueWalk = callback.call(ctx, node, parent, tree, idx);
// ^^^^^^^^^^
您需要检查continueWalk
的内容,因为之前调用了一行。
相关文章:
- 递归函数中断
- 将jQuery对象传递到setTimeout递归函数中
- 对象与递归函数的比较
- 循环内部的递归函数未按预期工作
- 递归函数返回不正确
- 递归函数编程困境
- 给定一个带有数字的数组,我如何编写一个递归函数,当 2 个元素加起来为一个目标时,它会在数组中查找索引
- 返回不会退出 javascript 中的递归函数
- jquery递归函数转换为非递归函数
- AngularJS,promise带有递归函数
- 如何停止此递归函数
- 如何将下面的递归函数转换为纯函数
- jQuery setTimeout ajax递归函数在即时消息程序中短时间后抛出错误
- Javascript递归函数引用了这一点
- 如何将这个递归函数转换为迭代函数
- jQuery递归函数调用和Javascript之间有区别吗;s setInterval
- 从javascript中的递归函数获取undefined
- 将递归函数转换为异步 CPS 实现 (javascript)
- 如何从递归函数中断和返回
- JavaScript 递归函数在调用中包含 () 时中断