2009-07-04 4 views
14

Я хотел бы создать дерево HTML (желательно UL-LI) из приведенного ниже примера JSON. Кто-нибудь имеет простой, рекурсивную функцию JS (а не фреймворк), которая может обрабатывать эту конкретную структуру? Спасибо за вашу помощь!Преобразование JSON в дерево HTML

{ "folder" : [ { 
    "title" : "1", 
    "folder" : [ { 
     "title" : "1.1", 
     "folder" : [ { 
      "title" : "1.1.1", 
     } , { 
      "title" : "1.1.2", 
     } ] 
    } ] 
} , { 
    "title" : "2", 
} ] } 

ответ

7
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; 
} 

Оговорка: не проверяя нет ошибок! Если отсутствует «заголовок» или «папка», все это может взорваться.

Приветствия,

+0

Это также отсутствует добавление литиево в ул. Добавьте ul.appendChild (li) перед закрытием цикла for, и он должен работать. –

+1

Существует также проблема со сроком действия: название UL просто добавлено к нему. Это то, что не совсем полезно. – Boldewyn

+0

Хорошо, разрешено! Нет никакого названия, чтобы пойти с UL. – Boldewyn

0

@Boldewyn: Я считаю, что вы также можете использовать для ... В цикле вместо обычного для цикла, чтобы сократить код немного. Конечно, у меня нет большого опыта использования этого типа цикла, поэтому, пожалуйста, проверьте мой фрагмент кода.

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)); 
    } 
} 
+0

Да, это тоже. – Boldewyn

+0

Я включил его в свой ответ, спасибо! – Boldewyn

+0

Нет, снова вытащил. I будет содержать диапазон 0..n, а не элементы массива. – Boldewyn

6

У меня была проблема с получением мой браузер принимать структуру данных, представленную О.П., но вот полностью рабочий пример, который я нарисовал на моих собственных, подобных целей. Помимо функции я предоставляю структуру данных, а также имя/ветви вместо названия/папки.

<html> 
<head> 
<script> 
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)); 
} 
</script> 
</head> 

<body onload="renderTree()"> 
<div id="tree"></div> 
</body> 

</html> 
3

Я использовал PURE с некоторым успехом в прошлом для такого рода вещи.

2

Проверьте jquery plugin JSON2HTML, это немного проще в использовании, чем PURE, и я использовал его на нескольких сайтах, которые я создал.

http://json2html.com

+0

ссылка не удалось обновить ссылку – wilsonrufus

2
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; 
} 
Смежные вопросы