Я пытаюсь создать объект JSON из элемента UL в Javascript.Преобразование неупорядоченного списка в 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"}]}
Это часть и это формат, который я хочу - выбирая поля id и name из childNode каждого элемента LI. Но это повторяющиеся узлы - меню 3 появляется дважды
Вот fiddle
Я, наверное, облажался рекурсия, но уставившись на него в течение 2 дней не работали, как. Может ли кто-нибудь помочь?
FWIW, я немного удивлен, что код работает на всех. Если код HTML действительно написан так, то 'element.firstChild' на внешней' ul' _should_ возвращает текстовый узел пробела между 'ul' и' li'. В новых браузерах вы должны использовать '.firstElementChild', чтобы игнорировать текстовые узлы. – Alnitak
True - это просто для удобства чтения; Я снял перерывы в скрипке. Однако я не знал о .firstElementChild (!), Поэтому я кое-что узнал. Спасибо за это. – WindsorAndy
@WindsorAndy не забывайте, что 'firstElementChild' является умеренно недавним дополнением к спецификации DOM - он может не существовать в старых браузерах. – Alnitak