我試圖從Javascript中的UL元素構建JSON對象。將無序列表轉換爲JSON
我有這樣的表結構:
<ul id="trainingmenu">
<li class="tmnode"><span id="M5lx9n" class="tmname">menu 1</span>
<ul>
<li class="tmnode"><span id="M66p48" class="tmname">menu 2</span>
<ul>
<li class="tmnode"><span class="tmname" id="Mschr">menu 3</span>
</li>
</ul>
</li>
<li class="tmnode"><span id="Mu03e0" class="tmname">menu 4</span></li>
</ul>
</li>
</ul>
這是JS:
var treeObject = {};
function treeHTML(element, object) {
if (element.tagName=="UL") { element=element.firstChild; }
object["id"] = element.firstChild.id;
object["name"] = element.firstChild.innerHTML;
var nodeList = element.getElementsByTagName('LI');
if (nodeList[0]) {
object["nodes"] = [];
for (var i = 0; i < nodeList.length; i++) {
object["nodes"].push({});
treeHTML(nodeList[i], object["nodes"][object["nodes"].length - 1]);
}
}
}
treeHTML(document.getElementById("trainingmenu"), treeObject);
alert(JSON.stringify(treeObject));
..和這是我得到的輸出:
{"id":"M5lx9n","name":"menu 1","nodes":[{"id":"M66p48","name":"menu 2","nodes":[{"id":"Mschr","name":"menu 3"}]},{"id":"Mschr","name":"menu 3"},{"id":"Mu03e0","name":"menu 4"}]}
這部分這是我想要的格式 - 從每個LI元素的childNode中挑選id和name字段。但它是重複的節點 - 菜單3出現了兩次
這裏有一個fiddle
我可能搞砸了遞歸,但它已經盯着2天都沒有制定出如何。誰能幫忙?
FWIW,我微微一愣的代碼在所有工作。如果HTML代碼確實如此寫入,則外部'ul'上的'element.firstChild' _should_返回'ul'和'li'之間的空白文本節點。在較新的瀏覽器中,您可以使用'.firstElementChild'來忽略文本節點。 – Alnitak
正確 - 這只是爲了便於閱讀;我刪除了小提琴的中斷。但是,我不知道.firstElementChild(!),所以我在那裏學到了一些東西。感謝那。 – WindsorAndy
@WindsorAndy不要忘記'firstElementChild'是DOM規範中的一個適度增加 - 它可能不存在於舊版瀏覽器中。 – Alnitak