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”属性,它的值总是一个数组。这是故意的吗?