Преобразование JSON в HTML-дерево
Я хотел бы сгенерировать дерево HTML (желательно UL-LI) из приведенного ниже примера JSON. Кто-нибудь имеет простую, рекурсивную JS-функцию (а не фреймворк), которая может обрабатывать эту конкретную структуру? Спасибо за вашу помощь!
{ "folder" : [ {
"title" : "1",
"folder" : [ {
"title" : "1.1",
"folder" : [ {
"title" : "1.1.1",
} , {
"title" : "1.1.2",
} ]
} ]
} , {
"title" : "2",
} ] }
Ответы
Ответ 1
function to_ul (obj) {
// --------v create an <ul> element
var f, li, ul = document.createElement ("ul");
// --v loop through its children
for (f = 0; f < obj.folder.length; f++) {
li = document.createElement ("li");
li.appendChild (document.createTextNode (obj.folder[f].title));
// if the child has a 'folder' prop on its own, call me again
if (obj.folder[f].folder) {
li.appendChild (to_ul (obj.folder[f].folder));
}
ul.appendChild (li);
}
return ul;
}
Предостережение: проверка ошибок! Если отсутствует "заголовок" или "папка", все может взорваться.
Приветствия,
Ответ 2
У меня была проблема с тем, чтобы заставить мой браузер принять структуру данных, представленную OP, но вот полностью рабочий пример, который я разработал для своих собственных подобных целей. Помимо функции я также предоставляю структуру данных с именем/ветвями вместо заголовка/папки.
function to_ul(branches) {
var ul = document.createElement("ul");
for (var i = 0, n = branches.length; i < n; i++) {
var branch = branches[i];
var li = document.createElement("li");
var text = document.createTextNode(branch.name);
li.appendChild(text);
if (branch.branches) {
li.appendChild(to_ul(branch.branches));
}
ul.appendChild(li);
}
return ul;
}
function renderTree() {
var treeEl = document.getElementById("tree");
var treeObj = {
"root": [{
"name": "George & Sarah Trede",
"branches": [{
"name": "George & Frances Trede",
"branches": [{
"name": "Mary (Trede) Jempty"
}, {
"name": "Carol (Trede) Moeller"
}]
}, {
"name": "Mary (Trede) Sheehan"
}, {
"name": "Ward Trede"
}]
}]
};
treeEl.appendChild(to_ul(treeObj.root));
}
renderTree()
<div id="tree"></div>
Ответ 3
Я использовал PURE с некоторым успехом в прошлом для такого рода вещей.
Ответ 4
Проверьте jQuery-плагин JSON2HTML, он немного проще в использовании, чем PURE, и я использовал его на нескольких сайтах, которые я создал.
http://json2html.com
Ответ 5
function to_li(obj, name) {
var li = document.createElement("li");
if (typeof(name) != "undefined") {
var strong = document.createElement("strong");
strong.appendChild(document.createTextNode(name + ": "));
li.appendChild(strong);
}
if (typeof(obj) != "object"){
li.appendChild(document.createTextNode(obj));
} else {
var ul = document.createElement ("ul");
for (var prop in obj){
ul.appendChild(to_li(obj[prop],prop));
}
li.appendChild(ul);
}
return li;
}
Ответ 6
@Boldewyn: Я считаю, вы также можете использовать For... In loop вместо обычного цикла For, чтобы немного сократить код. Конечно, у меня нет большого опыта использования этого типа цикла, поэтому, пожалуйста, проверьте мой фрагмент кода.
for (var i in obj.folder) {
li = document.createElement ("li");
li.appendChild (document.createTextNode (i.title));
// if the child has a 'folder' prop on its own, call me again
if (i.folder) {
li.appendChild (to_ul (i.folder));
}
}