2012-04-27 83 views
0

我是一个带有json数组/对象的新手。我正在尝试访问我的.json文件中的一些子对象。我在这里试过了这些建议,但我一直在收到“未定义”的结果。这里是.json -循环浏览json子对象并对每个“元素”做些什么

{ 
    "DACcourses": [ 
    { 
     "longTitle": "<a href='#'>Ammo-29 Electrical Explosives Safety for Naval Facilities</a>", 
     "longDescript": "ammo-29.html", 
     "atrrsLink": "Win 95+", 
     "delMeth": "standard", 
     "sked": [ 
     { 
     "classNumb": "926", 
      "startDate": "4/16/2012", 
      "endDate": "4/20/2012", 
      "location": "NMC Fort Worth, TX", 
      "status": "scheduled", 
      "emptySeats": "Availability" 
     }, 
     { 
      "classNumb": "001", 
      "startDate": "6/4/2012", 
      "endDate": "6/8/2012", 
      "location": "McAlester, OK", 
      "status": "scheduled", 
      "emptySeats": "Availability" 
     }, 
     { 
      "classNumb": "920", 
      "startDate": "6/18/2012", 
      "endDate": "6/22/2012", 
      "location": "Belle Chasse, LA", 
      "status": "scheduled", 
      "emptySeats": "Class Full" 
     } 
     ]} 
]} 

我必须做一些根本性的错误。所以这里是我的代码。最后,我试图从每个“sked”对象中构建表格行。但我在获取单个数据元素以在控制台中显示时遇到问题。这里一直是我的尝试:

$('#content').on("click", "#catList tbody tr", function() { 
        var aData = oTable.fnGetData(this); 
        console.log(aData); 
        var scheduleData = aData.sked; 
        var catLink = 'catalog/' + aData.longDescript; 
        $('#fullDescript').load(catLink, function() { 
         if (!$('#fullDescript #offerings')) { 
          $('.enrollBTN').hide(); 
         }; 

         if ($(scheduleData).length > 0) { 
          $(scheduleData).each(function() { 
           for(var i = 0; i < scheduleData.length; i++) { 
            /*var startDate = aData.sked.startDate[2]; 
            var endDate = aData.sked.endDate[3]; 
            var location = aData.sked.location[4]; 
            var classNumb = aData.sked.classNumb[1]; 
            var status = aData.sked.status[5]; 
            var emptySeats = aData.sked.emptySeats[6];*/ 
            //var item = scheduleData[i]; 
            console.log(aData.sked.startDate[2]); 
            var html = "<tr>"; 
             html += "<td>" + item.classNumb + "<\/td>"; 
             //console.log(aData.sked[1].classNumb); 
             /*html += "<td>" + scheduleData.endDate + "<\/td>"; 
             html += "<td>" + scheduleData.location + "<\/td>"; 
             html += "<td>" + scheduleData.classNumb + "<\/td>"; 
             html += "<td>" + scheduleData.status + "<\/td>"; 
             html += "<td>" + scheduleData.emptySeats + "<\/td>";*/ 
             html += "<\/tr>"; 
             //return scheduleData; 
            }; 
           $('#schedule tbody').append($(html)); 
          }); 
         }; 
        }); 

        $('#content').hide(); 
        $('#fullDescript').show(); 
       }); 

任何帮助表示赞赏。

回答

1

看起来好像你只需要每个循环,但不是两个。它看起来似乎有一些混淆是否使用item = scheduleData [i]或不。试试这个:

if ($(scheduleData).length > 0) { 
    for(var i = 0; i < scheduleData.length; i++) { 
     var item = scheduleData[i]; 
     var html = "<tr>"; 
     html += "<td>" + item.endDate + "</td>"; 
     // ... etc 
     html += "</td>"; 
    } 
} 

就像一个PS,我建议寻找一个JS模板工具,如Mustache.js。这将允许您从显示模板中分离数据,因此您可以消除解析代码。这将是这个样子:

var template = "{{#sked}}<tr><td>{{endDate}}</td><td>{{location}}</td></tr>{{/sked}}"; 
var html = "<table>" + Mustache.render(template, aData) + "</table>"; 
+0

dbaseman,谢谢你的教育。我知道我在这方面做得太多了。我的问题似乎比我做得更简单。但是当我付诸行动时,我发现了一个问题。我只看到正在渲染的最后一个滑动项目。我通过评论我的.json文件中最后两个sked对象来证明这一点。 reran我的应用程序。现在它只渲染了第一个滑动对象。所以在某个地方,我错过了一个外部循环,或者我在错误的地方开始循环。有任何想法吗?? – 2012-04-27 23:32:50

+0

请查看www.serco-hrc.com/crseCatalog/index.html。从任一菜单中选择课程目录。转到第二个(“下一个”)数据页面。然后选择“弹药-29电爆炸药安全...”。应该有3个课程的产品,它带来了。让我感到困惑。代码看起来正确。 tony – 2012-04-27 23:36:42

0

我必须做一些根本性的错误

是的,你是。

当您使用.each循环时,您可以通过this关键字引用当前元素。所以你不需要for循环。或者,如果您需要for循环,则不需要.each循环。在我看来,使用for循环。在这种情况下,.each只是一个开销。

UPDATE: @dbaseman给你,你需要什么:)

更新2:请尝试以下代码。基本上和dbaseman一样,但是dbaseman的片段错过了关闭<tr>元素。

if ($(scheduleData).length > 0) { 
    for(var i = 0; i < scheduleData.length; i++) { 
     var item = scheduleData[i]; 
     var html = "<tr>"; 
     html += "<td>" + item.endDate + "</td>"; 
     // ... etc 
     html += "</tr>"; // should close the <tr> here 
    } 
} 
+0

Nikhil,dbaseman, – 2012-04-27 23:27:57

+0

Nikhil,(这是梵文,我相信)。但另一方面,我遵循了dbaseman的建议,它的作用就像一个魅力。但它只呈现一个表格行,不管有多少个表格对象。我是否需要重新思考我的json格式/模式?我试着在另一个“for”循环中打包@dbaseman“for”循环,但是这又回到了undefined的返回。 Tony – 2012-04-28 04:29:07

+0

@EnergeticPixels我很惊喜!是的,它是梵文:)我认为你的模式是可以的,你不需要改变它,它只是我们需要更正的'for'循环。 – Nikhil 2012-04-28 05:01:43