javascript - 将递归节点遍历变成迭代节点遍历

标签 javascript algorithm dom recursion iteration

我在 tree order 中有一个遍历文档树中节点的递归算法

这将如何迭代? My attempt at making it iterative completely failed

function recursivelyWalk(nodes, cb) {
    for (var i = 0, len = nodes.length; i < len; i++) {
        var node = nodes[i],
            ret = cb(node)

        if (ret) {
            return ret
        }

        if (node.childNodes.length) {
            var ret = recursivelyWalk(node.childNodes, cb)
            if (ret) {
                return ret
            }
        }
    }
}

最佳答案

连接子节点(如果有的话)并使用 while(nodes.length) 循环怎么样?基本上,不断向堆栈添加新节点,并继续运行循环(每次测试一个节点)直到堆栈为空:http://jsfiddle.net/gEm77/1/ .

var z = 0; // my precaution for a while(true) loop

function iterativelyWalk(nodes, cb) {
    nodes = [].slice.call(nodes);

    while(++z < 100 && nodes.length) {
        var node = nodes.shift(),
            ret = cb(node);

        if (ret) {
            return ret;
        }

        if (node.childNodes.length) {
            nodes = [].slice.call(node.childNodes).concat(nodes);
        }
    }
}

关于javascript - 将递归节点遍历变成迭代节点遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9549102/

相关文章:

c++ - 对结构列表进行两次排序 C++

Angular @Input 以编程方式为 3rd 方控件设置

javascript - 检测 JavaScript 中的选项卡/窗口激活

javascript - 如果移除了一个 DOM 元素,它的监听器是否也会从内存中移除?

javascript - Jquery SVG : How to get callback if browsers don't support svg?

javascript - PHP/JS : Summarize ajax requests

C#高效算法基于整数的幂函数

algorithm - 基于可用空闲时间的 Group Maker 算法

javascript - 在 React 中的 html 输入中转换美分和美元

javascript - 在 Chrome 59 中运行的 JQuery 代码现在在 Chrome 60 中失效