为什么我的数组不会被填充?

时间:2014-06-05 05:31:41

标签: javascript arrays

我有一个返回2个数组的javascript函数。每个数组元素都是一个数组,每个数组都包含一个coursject对象。

我知道这很复杂,但我团队中的其他人负责从课程中生成可能的时间表,他们希望我像这样回到他们身边。

我对我所拥有的内容进行了一些测试,并且由于某种原因,第二级数组没有被填充或定义。就像我将一个可选类作为我的输入(我们有一个UI)一样,OptcourseArray包含未定义的元素。

以下是创建OptcourseArray的代码。它似乎正确地创建了一个对象数组的数组?我想我一定搞砸了。

对于代码上下文:

numOptCourses是可选课程的数量 optCourses是一系列课程对象 courseNumber是课程的课程编号,catalog_num也是。这样,具有多个部分的类将进入同一个数组。

var OptcourseArray = [];  
var catNum = 0;

for(var j = 0; j < numOptCourses; j++){
  catNum = optCourses[j].courseNumber;
  var myArray = [];

  for(var h = 0; h < OptclassList.length; h++){
    if (OptclassList[h].catalog_num === catNum){
      myArray.push(OptclassList[h]);
    }
  } 

  OptcourseArray.push(myArray);
} 

1 个答案:

答案 0 :(得分:2)

Acoustic77,

这是修改后的queryCourseData方法。

我使用async:false将你的$ .getJSON转换为$ .ajax(这可能是也可能不是我的问题,所以我鼓励你尝试将其设置为true并测试它是否适用于你的结尾或不)。

然后我注意到你的startTime和endTime的格式是{hour:#,minute:#},而item.start_time和item.end_time是24小时格式的时间字符串。我写了一些代码将前一种形式转换成24小时格式(我确信有一种比我更优雅的方式)。

我后来,在我最初的回答之后,注意到你正在将myArray设置为[]内部for循环的每一步,你正在构建ReqcourseArray和OptcourseArrays。移动var myArray = []在内部之外是我的最终修复。

我离开了我的console.log,所以你可以看到结果。

function queryCourseData(startTime, endTime, optCourses, reqCourses, numOptCourses, numReqCourses)
{

var numClasses = optCourses.length;
var OptclassList = [];
var i = 0;
for(var m = 0; m < numClasses; m++)
{
    //IrishGeek82@SO, 2014-06-05
    //Your ajax calls were taking too long to call so the code that needed them was
    //getting called before the data was ready.
    //This could be a problem on my end so you can always set async to true and test from your end.
    $.ajax({url:"http://vazzak2.ci.northwestern.edu/courses/?term=4540&subject="+optCourses[m].subject, 
            async: false,
            dataType: 'json',
            success:function(result) 
                    {
                        //IrishGeek82@SO, 2014-06-05
                        //Your start and end times are objects of the format
                        //{hour:x, minute:x}
                        //While your item.start_time and item.end_time are 24 hour time strings.
                        //I am sure there is a more elgant way to do this but here is a dirty conversion
                        //from one to the other.
                        var sTime = (startTime.hour<10?"0"+startTime.hour:startTime.hour) + ":" + startTime.minute+"00";
                        var eTime = (endTime.hour<10?"0"+endTime.hour:endTime.hour) + ":" + endTime.minute+"00";
                        $(result).each(function (index, item) 
                                       {
                                            if (item.start_time > sTime) 
                                            {
                                                if (item.end_time < eTime)
                                                {
                                                    if (item.catalog_num == optCourses[m].courseNumber)
                                                    {
                                                        var coursject = {
                                                                            title: item.title,
                                                                            professor: item.instructor.name,
                                                                            catalog_num: item.catalog_num,
                                                                            section: item.section,
                                                                            subject: item.subject,
                                                                            meeting_days: item.meeting_days,
                                                                            start_time: item.start_time,
                                                                            end_time: item.start_time
                                                                        };

                                                        //IrishGeek82@SO
                                                        //Now Pushing Entries Into Array
                                                        OptclassList.push(coursject);
                                                        i++;
                                                    }
                                                }
                                            }        
                                        });
                    }
          });

}    

var OptcourseArray = [];    
for(var j = 0; j < numOptCourses; j++)
{
    var catNum = optCourses[j].courseNumber;
    //IrishGeek82@SO
    //You were resetting your myArray every time you in the loop below.
    //Subsequently, only the last entry would every get added and you were
    //getting empty arrays.
    var myArray = [];        
    for(var h = 0; h<OptclassList.length; h++)
    {
            if (OptclassList[h].catalog_num == catNum)
            {
                myArray.push(OptclassList[h]);
            }
    }   

    OptcourseArray.push(myArray);
}

console.log("--OPT--");
console.log(JSON.stringify(OptcourseArray));
console.log("--OPT--");

var ReqclassList = [];
var g = 0;
for(var n = 0; n < reqCourses.length; n++)
{
    //IrishGeek82@SO, 2014-06-05
    //Your ajax calls were taking too long to call so the code that needed them was
    //getting called before the data was ready.
    //This could be a problem on my end so you can always set async to true and test from your end.
    $.ajax({url:"http://vazzak2.ci.northwestern.edu/courses/?term=4540&subject="+reqCourses[n].subject, 
            async: false,
            dataType: 'json',
            success:  function(result) 
                      {

                        //IrishGeek82@SO, 2014-06-05
                        //Your start and end times are objects of the format
                        //{hour:x, minute:x}
                        //While your item.start_time and item.end_time are 24 hour time strings.
                        //I am sure there is a more elgant way to do this but here is a dirty conversion
                        //from one to the other.                          
                        var sTime = (startTime.hour<10?"0"+startTime.hour:startTime.hour) + ":" + startTime.minute+"00";
                        var eTime = (endTime.hour<10?"0"+endTime.hour:endTime.hour) + ":" + endTime.minute+"00";

                        $(result).each(function (index, item) 
                                       {

                                            if (item.start_time > sTime) 
                                            {

                                                if (item.end_time < eTime)
                                                {

                                                    if ($.trim(item.catalog_num) == $.trim(reqCourses[n].courseNumber))
                                                    {
                                                        var coursject = {
                                                                            title: item.title,
                                                                            professor: item.instructor.name,
                                                                            catalog_num: item.catalog_num,
                                                                            section: item.section,
                                                                            subject: item.subject,
                                                                            meeting_days: item.meeting_days,
                                                                            start_time: item.start_time,
                                                                            end_time: item.start_time
                                                                        };
                                                        //IrishGeek82@SO
                                                        //Now Pushing Entries Into Array
                                                        ReqclassList.push(coursject);
                                                        g++;
                                                    }
                                                }
                                            }        
                                        });


                      }
            });
}

var ReqcourseArray = [];    
for(var j = 0; j < numReqCourses; j++)
{
    var catNum = reqCourses[j].courseNumber;
    //IrishGeek82@SO
    //You were resetting your myArray every time you in the loop below.
    //Subsequently, only the last entry would every get added and you were
    //getting empty arrays.
    var myArray = [];
    for(var h = 0; h < ReqclassList.length; h++)
    {
            if ($.trim(ReqclassList[h].catalog_num) == $.trim(catNum))
            {
                myArray.push(ReqclassList[h]);
            }
    }   

    ReqcourseArray.push(myArray);
}

console.log("--REQ--");
console.log(JSON.stringify(ReqcourseArray));
console.log("--REQ--");

return [OptcourseArray, ReqcourseArray];

}

我的测试结果如下:

测试用例:

2 courses
EECS 214-0  (optional)
EECS 223-0  (required)

结果:

XHR finished loading: GET "http://vazzak2.ci.northwestern.edu/courses/?term=4540&subject=EECS". 
--OPT--
[[{"title":"Data Structures & Data Management","professor":"Morteza Amir Rahimi","catalog_num":"214-0","section":"21","subject":"EECS","meeting_days":"MoWeFr","start_time":"11:00:00","end_time":"11:00:00"}]]
--OPT--
XHR finished loading: GET "http://vazzak2.ci.northwestern.edu/courses/?term=4540&subject=EECS". jquery.min.js:4
--REQ--
[[{"title":"Fundamentals of Solid State Engineering","professor":"Koray Aydin","catalog_num":"223-0","section":"01","subject":"EECS","meeting_days":"MoTuWeFr","start_time":"09:00:00","end_time":"09:00:00"}]]
--REQ-- 

测试用例:

5 courses:
EECS 214-0 (optional)
EECS 223-0 (required)
EECS 110-0 (required)
EECS 213-0 (required)
EECS 203-0 (optional)

结果:

XHR finished loading: GET "http://vazzak2.ci.northwestern.edu/courses/?term=4540&subject=EECS". jquery.min.js:4
XHR finished loading: GET "http://vazzak2.ci.northwestern.edu/courses/?term=4540&subject=EECS". jquery.min.js:4
--OPT--
[[{"title":"Data Structures & Data Management","professor":"Amartya Banerjee","catalog_num":"214-0","section":"20","subject":"EECS","meeting_days":"MoWeFr","start_time":"09:00:00","end_time":"09:00:00"},{"title":"Data Structures & Data Management","professor":"Morteza Amir Rahimi","catalog_num":"214-0","section":"21","subject":"EECS","meeting_days":"MoWeFr","start_time":"11:00:00","end_time":"11:00:00"}],[{"title":"Introduction to Computer Engineering","professor":"Hai Zhou","catalog_num":"203-0","section":"01","subject":"EECS","meeting_days":"MoWeFr","start_time":"11:00:00","end_time":"11:00:00"}]]
--OPT--
XHR finished loading: GET "http://vazzak2.ci.northwestern.edu/courses/?term=4540&subject=EECS". jquery.min.js:4
XHR finished loading: GET "http://vazzak2.ci.northwestern.edu/courses/?term=4540&subject=EECS". jquery.min.js:4
XHR finished loading: GET "http://vazzak2.ci.northwestern.edu/courses/?term=4540&subject=EECS". jquery.min.js:4
--REQ--
[[{"title":"Fundamentals of Solid State Engineering","professor":"Koray Aydin","catalog_num":"223-0","section":"01","subject":"EECS","meeting_days":"MoTuWeFr","start_time":"09:00:00","end_time":"09:00:00"}],[{"title":"Introduction to Computer Programming","professor":"Aleksandar Kuzmanovic","catalog_num":"110-0","section":"20","subject":"EECS","meeting_days":"MoTuWeFr","start_time":"10:00:00","end_time":"10:00:00"}],[{"title":"Introduction to Computer Systems","professor":"Peter A Dinda","catalog_num":"213-0","section":"20","subject":"EECS","meeting_days":"TuTh","start_time":"14:00:00","end_time":"14:00:00"}]]
--REQ--

请告诉我这是否有帮助:)