所以我有一段代码看起来像这样:
stack.forEach(function(element){
//sys.puts(sys.inspect(element, false, null));
console.log('-----element start-----');
console.log(element.type + ':' + element.raw);
console.log('-----element end-----');
if(element.children){
element.children.forEach(function(childElement){
stack.push(childElement);
});
}
});
问题在于,这与我的行为不同,除了堆栈的行为之外,我想知道这是否与 JavaScript 本身有关。我看到的问题是,当我为每个 child 调用 stack.push 以将其添加到堆栈中进行处理时,初始 stack.forEach() 似乎没有拾取它,它只是记录到顶级元素.如果我尝试在这个之后直接执行另一个 stack.forEach() ,它会显示下一级子元素,所以我知道 .push 正在将子元素添加到堆栈中。
.forEach() 看起来几乎是按原样获取数据,如果它们发生在 foreach 中,则不会获得更新。这对 JavaScript 来说是真的吗?有没有不同的方法可以完成同样的事情(能够处理顶级元素和它下面的所有级别的子元素)?
最佳答案
你的猜测是正确的。 ForEach 函数获取数组的快照,并且不会处理任何更新。
您正在尝试实现一个经典的树遍历算法,该算法最容易编码为递归函数,如下所示:
var stack = [];
function traverse (element) {
//sys.puts (sys.inspect(element, false, null));
console.log ('-----element start-----');
console.log (element.type + ':' + element.raw);
console.log ('-----element end-----');
stack.push (element); // for preorder traversal (parent before children)
if (element.children)
element.children.forEach (traverse);
// stack.push (element); // for postorder traversal (children before parent)
};
traverse (document.body); // for example
关于javascript - 创建一个类似 Stack 的行为是 JavaScript/Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13049309/