迭代 jQuery 格式化 JSON 不正确
Iterative jQuery formatting JSON incorrectly
我有一个包含许多嵌套对象的 JSON 文件,其结构类似于:
[
{
"name" : "Fruits",
"subNav" :
[
{
"name" : "Apples",
"subNav" :
[
{
"name" : "Type 1"
},
{
"name" : "Type 2"
},
{
"name" : "Type 3"
"subNav" :
[
{
"name" : "Type 3 A"
},
{
"name" : "Type 3 B"
}
]
}
]
}
]
}
]
这个 branching/nesting 结构非常广泛,还有很多 'key:value' 对,为了便于阅读,我将其省略。
我正在尝试创建迭代 jQuery/js,它可以遍历嵌套对象并将它们格式化为嵌套列表,如下所示:
$(document).ready(function() {
var json;
$.getJSON( "megaNav.json", function( data ) {
var items = [];
$.each(data , recurse);
function recurse(key,val) {
items.push( "<li class=''><a href=''>" + this.name + "</a></li>" );
if (val instanceof Object) {
if (this.hasOwnProperty('subNav')){
items.push("<ul>");
$.each(this.subNav , recurse);
items.push("</ul>");
}
}
};
$('#section-nav').append(items);
});
});
它适用于到达所有对象分支的深度,但是它不是将嵌套对象放入嵌套的 ul 中,而是创建 ul,/ul 对并将下一个 li 与前一个 li 放在同一级别,如下所示:
<li><a>...etc</a></li>
<li><a>...etc</a></li>
<ul></ul>
<li><a>...etc</a></li>
<ul></ul>
<li><a>...etc</a></li>
<li><a>...etc</a></li>
而不是像这样(它应该是怎样的):
<li><a>...etc</a></li>
<li><a>...etc</a></li>
<li>
<a>...etc</a>
<ul>
<li><a>...etc</a></li>
<li><a>...etc</a></li>
<li><a>...etc</a></li>
</ul>
</li>
想法?
更新:
在 lyosef769 的 jsfiddle 的帮助下解决了,他得到了答案!这是我需要的:http://jsfiddle.net/brLh8g5b/1/
JAVASCRIPT
var tempData = [{
"name": "Fruits",
"subNav":[{
"name": "Apples",
"subNav":[{
"name": "Type 1"
}, {
"name": "Type 2"
}, {
"name": "Type 3",
"subNav":[{
"name": "Type 3 A"
}, {
"name": "Type 3 B"
}]
}]
}]
}];
var $ul = $('<ul></ul>');
function createList($list, items) {
items.forEach(function(item){
var $li = $('<li>');
$li.text(item.name);
if (item.subNav) {
$li.append('<ul></ul>');
createList($li.find('ul'), item.subNav);
}
$list.append($li);
});
}
createList($ul, tempData);
$('body').append($ul);
对字符串数组调用 jQuery 的 append
实际上是尝试将每个字符串添加为单独的元素。
所以 ["<ul>","<li>..</li>","<li>..</li>","</ul>"]
的数组将被转换为一个 ul
元素,后面跟着两个 li
元素,并且 jQuery 忽略最后一个标签,因为它可以'解析它。
你应该打电话给 $('#section-nav').append(items.join(""));
。这样 jQuery 将尝试将整个结构添加为单个字符串。
JSFiddle:http://jsfiddle.net/brLh8g5b/
我有一个包含许多嵌套对象的 JSON 文件,其结构类似于:
[
{
"name" : "Fruits",
"subNav" :
[
{
"name" : "Apples",
"subNav" :
[
{
"name" : "Type 1"
},
{
"name" : "Type 2"
},
{
"name" : "Type 3"
"subNav" :
[
{
"name" : "Type 3 A"
},
{
"name" : "Type 3 B"
}
]
}
]
}
]
}
]
这个 branching/nesting 结构非常广泛,还有很多 'key:value' 对,为了便于阅读,我将其省略。
我正在尝试创建迭代 jQuery/js,它可以遍历嵌套对象并将它们格式化为嵌套列表,如下所示:
$(document).ready(function() {
var json;
$.getJSON( "megaNav.json", function( data ) {
var items = [];
$.each(data , recurse);
function recurse(key,val) {
items.push( "<li class=''><a href=''>" + this.name + "</a></li>" );
if (val instanceof Object) {
if (this.hasOwnProperty('subNav')){
items.push("<ul>");
$.each(this.subNav , recurse);
items.push("</ul>");
}
}
};
$('#section-nav').append(items);
});
});
它适用于到达所有对象分支的深度,但是它不是将嵌套对象放入嵌套的 ul 中,而是创建 ul,/ul 对并将下一个 li 与前一个 li 放在同一级别,如下所示:
<li><a>...etc</a></li>
<li><a>...etc</a></li>
<ul></ul>
<li><a>...etc</a></li>
<ul></ul>
<li><a>...etc</a></li>
<li><a>...etc</a></li>
而不是像这样(它应该是怎样的):
<li><a>...etc</a></li>
<li><a>...etc</a></li>
<li>
<a>...etc</a>
<ul>
<li><a>...etc</a></li>
<li><a>...etc</a></li>
<li><a>...etc</a></li>
</ul>
</li>
想法?
更新: 在 lyosef769 的 jsfiddle 的帮助下解决了,他得到了答案!这是我需要的:http://jsfiddle.net/brLh8g5b/1/
JAVASCRIPT
var tempData = [{ "name": "Fruits", "subNav":[{ "name": "Apples", "subNav":[{ "name": "Type 1" }, { "name": "Type 2" }, { "name": "Type 3", "subNav":[{ "name": "Type 3 A" }, { "name": "Type 3 B" }] }] }] }];
var $ul = $('<ul></ul>');
function createList($list, items) {
items.forEach(function(item){
var $li = $('<li>');
$li.text(item.name);
if (item.subNav) {
$li.append('<ul></ul>');
createList($li.find('ul'), item.subNav);
}
$list.append($li);
});
}
createList($ul, tempData);
$('body').append($ul);
对字符串数组调用 jQuery 的 append
实际上是尝试将每个字符串添加为单独的元素。
所以 ["<ul>","<li>..</li>","<li>..</li>","</ul>"]
的数组将被转换为一个 ul
元素,后面跟着两个 li
元素,并且 jQuery 忽略最后一个标签,因为它可以'解析它。
你应该打电话给 $('#section-nav').append(items.join(""));
。这样 jQuery 将尝试将整个结构添加为单个字符串。
JSFiddle:http://jsfiddle.net/brLh8g5b/