JavaScript:I';我不确定在通过节点的while循环中使用什么条件

JavaScript:I';我不确定在通过节点的while循环中使用什么条件,javascript,html,google-chrome-extension,Javascript,Html,Google Chrome Extension,假设我有一个静态的节点数组:noderray[,,],每个节点都有大量的属性。一个这样的属性是子节点,该属性的值是下一个子节点的HTMLCollection 例如: 如果这是一个父级。这是一个子节点是nodeArray中的第一个节点,调用console.log(nodeArray[0].children)将记录HTMLCollection[span]。节点将具有与其父节点完全相同的结构,其自身的子节点属性包含更多子节点的值(在这种情况下,它将是一个空的HTMLCollection,因为节点没有更

假设我有一个静态的节点数组:
noderray[,,]
,每个节点都有大量的属性。一个这样的属性是
子节点
,该属性的值是下一个子节点的HTMLCollection

例如:

如果
这是一个父级。这是一个子节点
是nodeArray中的第一个节点,调用
console.log(nodeArray[0].children)
将记录
HTMLCollection[span]
节点将具有与其父节点完全相同的结构,其自身的
子节点
属性包含更多子节点的值(在这种情况下,它将是一个空的HTMLCollection,因为
节点没有更多的子节点)

上下文:

JavaScript是一个chrome扩展内容脚本,它将网页中选定的文本元素整理成一个节点数组。这意味着我永远无法确定所选任何给定元素将有多少子节点,因为我没有编写网页的HTML。随后,如果我想在每个子元素上执行代码,我将需要使用while循环


这就是问题所在-我应该在while循环中使用什么条件来允许我循环,直到没有更多的子元素为止。

你的意思是像递归循环一样

function doSomethingWithNodes(nodes, level)
{
  level = level || 1;

  nodes.forEach(function(node) {
    console.log('Level ' + level, node);

    if ('children' in node && Array.isArray(node.children))
      doSomethingWithNodes(node.children, level + 1);
  });
}

doSomethingWithNodes(nodeArray);

您可以使用以下通用函数:

const forEachNode = (callback, arrayLike) => 
  ([...arrayLike].forEach(value => {
    callback(value);
    if (typeof value.children === "object" && value.children.length > 0) {
     forEachNode(callback, value.children)
    }
  }));

此时,您可以传递您的
noderray
和要为每个节点(及其子节点)执行的回调,例如:

forEachNode(console.log, nodeArray);
您还可以轻松编写函数:

    const logAllNodes = forEachNode.bind(null, console.log);

    const countAllNodes = (nodes) => {
      let count = 0;
      forEachNode(() => count++, nodes);
      return count;
    }

    const flatten = (nodes) => {
      let acc = [];
      forEachNode(node => acc.push(node), nodes);
      return acc;
    }

    logAllNodes(nodeArray);
    console.log(countAllNodes(nodeArray));
    console.log(flatten(nodeArray));

在我看来,你需要的不是一段时间的循环。你有没有想过使用其他东西?我不知道你在问什么…甚至没有考虑过递归,认为可以使用简单的while循环,干杯。那么请接受答案。下一次,如果你能提供一些你已经尝试过的代码,这样人们就能更好地帮助你,这将是很有帮助的。对不起,伙计,我是新来的,我会回答以下问题。我可以修改一下我的问题让它更清楚吗?Thx,既然你已经找到了帮助,我想没有必要进一步澄清这个问题,但是下次请记住这一点。有人关闭了你的问题,因为“它需要更多的关注”-你可以阅读更多关于它的内容。再次,大家好,你能简单地告诉我
if('children'在node&&Array.isArray(node.children))中的作用吗
?似乎总是满足这些条件,因为每个节点都有一个“children”属性,它的值总是一个数组。这是故意的吗?