javascript - 创建一个类似 Stack 的行为是 JavaScript/Node

标签 javascript node.js

所以我有一段代码看起来像这样:

  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/

相关文章:

javascript - 速率高于 60 fps 的 requestAnimationFrame

node.js - LocomotiveJS 服务器端口更改

Javascript fillRect 不从变量中绘制

javascript - 使用矩了解特定日期的数字类型的日和月

javascript - grunt requirejs 忽略来 self 的 mainConfigFile 的路径

javascript - 如何在 Node js 和 mongodb 中获取当前保存的文档 _id?

node.js - 杀死child_process时避免生成核心文件

javascript - 使用前缀/通配符删除 Redis/Node

javascript - 即使 javascript 对象打印值后,ag-grid 的 Grid API 中的 "setRowData"方法也不会加载任何行

javascript - 为什么 execCommand ('bold' ) 什么都不做?