Сохранить древовидную структуру в JSON
Всем привет! Очень прошу помочь с решением задачи.
Есть дерево: <body> <ul id="tree"> <li data-id="0">Автомобили <ul> <li data-id="1">Japan <ul> <li data-id="2">Toyota <ul> <li data-id="3">Camry</li> <li data-id="4">Avensis</li> </ul> </li> <li data-id="5">Mazda</li> </ul> </li> </ul> </ul> </body> необходимо это дерево поместить в объект вида: var cars={ Автомобили:{"children":[1], id="0"}, Japan: {"children":[2], id="1"}, Toyota:{"children":[3, 4], id="2"}, Mazda:{"children":[], id="5"} } пробовал разными способами делать обход дерева, но ничего не получается. Через рекурсию: function scan(el, obj) { var nodeList = el.childNodes; if (nodeList != null) { obj["children"]=[]; for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].nodeType == 1) { if(nodeList[i].firstChild.nextSibling.dataset.id) obj["child"].push(nodeList[i].firstChild.nextSibling.dataset.id); } scan(nodeList[i], obj["children"]); } } return obj; } scan(document.getElementById('tree'), {}) |
прошу прощения:
var cars={ Автомобили:{"children":[1], id:"0"}, Japan: {"children":[2], id:"1"}, Toyota:{"children":[3, 4], id:"2"}, Mazda:{"children":[], id:"5"} } |
Правильный объект:
var cars = { "Автомобили" : { "id" : 1, "country" : { "Japan" : { "id" : 11, "mark" : { "Toyota" : { "id" : 111, "model" : { "Camry" : { "id" : 1111 }, "Avensis" : { "id" : 1112 } } }, "Mazda" : { "id" : 112, "model" : { "CX-9" : { "id" : 1121 } } } } }, "Russia" : { "id" : 12, "mark" : { "Lada" : { "id" : 121, "model" : { "Kalina" : { "id" : 1211 }, "Priora" : { "id" : 1212 } } }, "UAZ" : { "id" : 122, "model" : { "Patriot" : { "id" : 1221 } } } } } } } }; alert( cars['Автомобили'].country['Japan'].mark['Toyota'].model['Camry'].id ); alert( cars['Автомобили'].country['Russia'].mark['Lada'].model['Kalina'].id ); |
Хорошо, пусть будет такая структура (она лучше чем моя, потому что есть вложенность элементов), пусть по подобию вашего объекта я восстановлю исходное дерево, но у меня проблема в программном создании такой структуры по HTML. Намекните хотя бы в каком направлении двигаться.
В общем моя задача состоит в создании дерева и последующем его сохранении здесь есть пример обратной задачи, т.е. считывание из объекта. |
Цитата:
|
Цитата:
|
timkit,
:write: <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> </head> <body> <ul id="tree"> <li data-id="0">Автомобили <ul> <li data-id="1">Japan <ul> <li data-id="2">Toyota <ul> <li data-id="3">Camry</li> <li data-id="4">Avensis</li> </ul> </li> <li data-id="5">Mazda</li> </ul> </li> </ul> </li> </ul> <script> function h(b, c) { b = b.children; for (var d = b.length, a; a = b[--d];) "li" == a.tagName.toLowerCase() ? (c['li '+a.dataset.id] = {}, c['li '+a.dataset.id][a.firstChild.data] = h(a, {})) : c.ul = h(a, {}); return c }; var data = h(document.getElementById('tree'), {}) document.write(JSON.stringify(data)) </script> </body> </html> |
Большое спасибо Рони , буду дальше разбираться :thanks:
|
рони, ты из "благих намерений" обфусцируешь, дабы неповадно было на форум обращаться, или считаешь что код таким и должен быть?
|
danik.js,
а вы из благих намерений всех гнобите, кто знает меньше вас, чтобы им Цитата:
|
Часовой пояс GMT +3, время: 15:39. |