问题描述
我正在尝试实现类似getElementByTagName的功能。 递归调用似乎存在问题,但我找不到错误所在。在第二个测试用例中,我得到的是0而不是3。请问您能否对此加以说明?
function byTagName(node,tagName) {
let nodes = [];
if (node.children.legnth == 0){
return [];
}
for(let i=0; i < node.children.length; i++){
const element = node.children[i];
if (element.nodeName.toLowerCase() == tagName){
nodes.push(element);
}
nodes.concat(byTagName(element,tagName));
}
return nodes;
}
console.log(byTagName(document.body,"h1").length);
// → 1
console.log(byTagName(document.body,"span").length);
// → 3
let para = document.querySelector("p");
console.log(byTagName(para,"span").length);
// → 2
<h1>heading with a <span>span</span> element.</h1>
<p>A paragraph with <span>one</span>,<span>two</span>
spans.</p>
解决方法
concat
创建一个新数组。它不会改变原始的。请改用.push
。
nodes.push(...byTagName(element,tagName));