如何以递归方式循环所有子项?

Mat*_*rym 25 javascript recursion children loops for-loop

我有以下内容:

for (var i = 0; i < children.length; i++){
   if(hasClass(children[i], "lbExclude")){
       children[i].parentNode.removeChild(children[i]);
   }
};
Run Code Online (Sandbox Code Playgroud)

我希望它能够遍历所有孩子的孩子等(不仅仅是顶层).我找到了这条线,似乎这样做:

for(var m = n.firstChild; m != null; m = m.nextSibling) {
Run Code Online (Sandbox Code Playgroud)

但是,如果我进行转换,我不清楚我如何引用当前的孩子?我不再需要澄清孩子的指数位置.有什么建议?

谢谢!

更新:

根据答案的建议,我现在正在使用以下内容.这是正确/最有效的方式吗?

function removeTest(child) {
  if (hasClass(child, "lbExclude")) {
    child.parentNode.removeChild(child);
  }
}

function allDescendants(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    var child = node.childNodes[i];
    allDescendants(child);
    removeTest(child);
  }
}

var children = temp.childNodes;
for (var i = 0; i < children.length; i++) {
  allDescendants(children[i]);
};
Run Code Online (Sandbox Code Playgroud)

Que*_*tin 44

function allDescendants (node) {
    for (var i = 0; i < node.childNodes.length; i++) {
      var child = node.childNodes[i];
      allDescendants(child);
      doSomethingToNode(child);
    }
}
Run Code Online (Sandbox Code Playgroud)

循环遍历所有子元素,并为每个元素调用相同的函数并使其循环遍历该元素的子元素.


Jam*_*mes 31

通常,您有一个可以在所有节点上递归调用的函数.这真的取决于你想对孩子们做些什么.如果你只是想收集所有的后代,那么element.getElementsByTagName可能是一个更好的选择.

var all = node.getElementsByTagName('*');

for (var i = -1, l = all.length; ++i < l;) {
    removeTest(all[i]);
}
Run Code Online (Sandbox Code Playgroud)

  • 然而,它们是通过hasClass方法测试的,所以我相信他们打算将它作为元素. (3认同)