如何使用javascript / jquery从嵌套列表生成嵌套的json对象
我想生成以下对象:
var ideaBoard = { "Staff Retreat" : { "Games" : [ {"title" : "Rockband", "details" : "1hr"}, {"title" : "Texas Hold em", "details" : "30min"} ], "Talks" : [ {"title" : "The Old You", "details" : "Dr. Smith"} ] } }
来自以下HTML:
Staff Retreat - Games
- Rockband 1hr
- Texas Hold em 30min
- Talks
- The Old You Dr. Smith
我是循环/数组/对象的新手 – 所以我真的很感激帮助!
我在这个项目的其他地方使用jQuery,如果有帮助的话。
谢谢!
有多种方式。 这是一个:
var ideaBoard = {} $('#data > ul').each(function() { var data = {}, // board data title = $(this).find('.board-title').text(); // board title // find categories $(this).find('> li > .category-title').each(function() { var category = $(this).text(), // category title // we can use map to create the array var category_data = $(this).next().children('li').map(function() { var tdata = {}; // each span contains detailed data $(this).children('span').each(function() { tdata[this.className] = $(this).text(); }); return tdata; }).get(); data[category] = category_data; }); ideaBoard[title] = data; });
DEMO
如果更改HTML的结构,这很可能会中断。 如果你有这么多的数据,这段代码也可能很慢。
要了解所使用的方法,请查看jQuery文档 。
它没有优化,但它的工作原理:
var result = {}; var node1; var node2; var node3; var tmpObj = {}; $('#data > ul').each(function() { node1 = $(this); result[node1.find('.board-title').text()] = {}; node1.find('.category-title').each(function() { node2 = $(this); result[node1.find('.board-title').text()][node2.text()] = []; node2.next('ul').children('li').each(function() { node3 = $(this); tmpObj = {}; node3.children('span').each(function() { tmpObj[$(this).attr('class')] = $(this).text(); }); result[node1.find('.board-title').text()][node2.text()].push(tmpObj); }) }); }); console.log(result);
你是如何生成HTML的? 如果您使用PHP,您可以将变量传递给JS,而不是稍后尝试从HTML中读取它们。 例如,如果你在数组中有它们,可以在PHP中使用json_encode,然后在你的页面中回显变量= jQuery.parseJSON(这里);
现在,如果你不能这样做,并且你真的想从HTML中读取它,那么你应该先用$(’#data’)选择id数据并取其子()。 然后为孩子们使用.each()。 然后将子项放到object中,然后使用.each()检查每个children()并将它们添加到对象中。 如果你可能不仅仅是那些级别,我建议你做一个递归函数。
PS:我不认为在UL和LI之间放置Span的正确HTML。