Javascript 迭代jQuery格式化JSON不正确
我有一个包含许多嵌套对象的JSON文件,其结构类似于:Javascript 迭代jQuery格式化JSON不正确,javascript,jquery,json,iteration,Javascript,Jquery,Json,Iteration,我有一个包含许多嵌套对象的JSON文件,其结构类似于: [ { "name" : "Fruits", "subNav" : [ { "name" : "Apples", "subNav" : [ {
[
{
"name" : "Fruits",
"subNav" :
[
{
"name" : "Apples",
"subNav" :
[
{
"name" : "Type 1"
},
{
"name" : "Type 2"
},
{
"name" : "Type 3"
"subNav" :
[
{
"name" : "Type 3 A"
},
{
"name" : "Type 3 B"
}
]
}
]
}
]
}
]
这个分支/嵌套结构非常广泛,并且还有很多“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);
});
});
$(文档).ready(函数(){
var-json;
$.getJSON(“megaNav.json”,函数(数据){
var项目=[];
$。每个(数据,递归);
函数递归(键,val){
项目。推送(“”;
if(对象的val实例){
if(this.hasOwnProperty('subNav')){
项目。推送(“”);
$.each(this.subNav,递归);
项目。推送(“
”);
}
}
};
$('部分导航')。附加(项目);
});
});
它用于到达所有对象分支的深度,但是,它不会将嵌套对象放入嵌套的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>
JAVASCRIPT
var tempData=[{
“名称”:“水果”,
“subNav”:[{
“名称”:“苹果”,
“subNav”:[{
“名称”:“类型1”
}, {
“名称”:“类型2”
}, {
“名称”:“类型3”,
“subNav”:[{
“名称”:“类型3 A”
}, {
“名称”:“类型3 B”
}]
}]
}]
}];
var$ul=$('
');
函数createList($list,items){
items.forEach(功能(项目){
变量$li=$(“”);
$li.文本(项目名称);
若有(子项AV){
$li.追加(“
”);
createList($li.find('ul'),item.subNav);
}
$list.append($li);
});
}
createList($ul,tempData);
$('body')。追加($ul);
在字符串数组上调用jQuery的append
实际上试图将每个字符串作为单独的元素添加
因此,[“”、“- 。
”、“- 。
”、“
”]
的数组将被转换为一个ul
元素,后跟两个li
元素,jQuery将忽略最后一个标记,因为它无法解析它
您应该调用$('#section nav').append(items.join(“”))代码>。这样,jQuery将尝试将整个结构添加为单个字符串
jsIDLE:一个
是另一个
的直接孩子是没有意义的-他们必须在一个的内部。这一点很好。但这并不能真正解决jQuery问题……你确定吗?您是否尝试过在检测到子菜单的情况下添加包装器?在lyosef769的JSFIDLE的帮助下解决了这个问题。他得到了答案!我需要的是:这几乎是完美的!我刚刚意识到的唯一问题是,我需要UL位于它上面的LI中,因此在JSON的情况下,每当一个对象有一个子AV时,UL应该位于该对象中,并在JSFIDLE的帮助下解决,这样您就可以得到答案了!我需要的是:
<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>
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);