我编写了一个递归函数,它遍历以下形式的嵌套 DOM 节点:
<a href="#" title="test">
<div id="nested-image">
<img src="image.jpg" />
</div>
</a>
递归函数如下:
function getNestedNodes(nodeList) {
var ary = [];
for(var i = 0; i < nodeList.length; ++i) {
var myJSONChildren = {};
if(nodeList[i].childElementCount) {
var htmlCollection = nodeList[i].children;
for(var j = 0; j < htmlCollection.length; ++j) {
for(var k =0, attrs = htmlCollection[j].attributes, l = attrs.length; k < l; ++k) {
myJSONChildren['tag'] = htmlCollection[j].nodeName;
myJSONChildren[attrs.item(k).nodeName] = attrs.item(k).nodeValue;
};
}
myJSONChildren['children'] = getNestedNodes(htmlCollection);
ary.push(myJSONChildren);
};
}
return ary;
}
所以如果我这样调用该函数:
var links = document.querySelectorAll('a');
console.log(JSON.stringify(getNestedNodes(links)));
它应该返回以下形式的 JSON 数组:
[{
tag:'a',
href:"#",
title:"test",
children:[{
tag:"div",
id:"nested-image",
children:[{
tag:"img",
src:"image.jpg"
}]
}]
}]
}]
但是,它只返回以下形式之一:
[{
"tag":"DIV",
"id":"nested-image",
"children":[{
"tag":"IMG",
"src":"https://www.gravatar.com/avatar/d1a336ae4b6876a4c5c044ec17876ce0",
"children":[]
}]
}]
而且我无法以正确的方式获得我想要的表格,而不会得到空结果或重复结果。
另外,我想优化我的递归函数,我确信我可以重构为更具可读性的东西。
这是一个小提琴供您查看:
任何帮助将不胜感激!