简体   繁体   English

为什么不填充我的阵列?

[英]Why isn't my array being populated?

I have a javascript function that returns 2 Arrays. 我有一个返回2个数组的javascript函数。 Each array element is an array, and each of those arrays contains a coursject object. 每个数组元素都是一个数组,并且每个数组都包含一个coursject对象。

I know this is complicated, but the other people on my team are in charge of generating possible schedules from the classes and they want me to return to them like that. 我知道这很复杂,但是我们团队中的其他人负责从课程中生成可能的时间表,他们希望我像这样回到他们的身边。

I've run some test on what I have, and for some reason the second level of arrays isn't getting populated or defined. 我已经对我所拥有的进行了一些测试,并且由于某种原因,第二级数组没有得到填充或定义。 Like if I put one optional class as my input (we have a UI), the OptcourseArray has elements that are undefined. 就像我将一个可选类作为输入(我们有一个UI)一样, OptcourseArray具有未定义的元素。

Below is just the code for creating the OptcourseArray . 以下是用于创建OptcourseArray的代码。 Does it seem to correctly make an array of arrays of objects? 它似乎正确地使对象数组变成数组吗? I think I must have messed something up in it. 我想我一定弄错了。

For code context: 对于代码上下文:

numOptCourses is the number of optional courses. numOptCourses是可选课程的数量。
optCourses is an array of course objects. optCourses是一组课程对象。
courseNumber is the course number of the class, as is catalog_num . courseNumber是课程的课程号, catalog_num This is so that classes with multiple sections go into the same array. 这样,具有多个节的类将进入同一数组。

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);
} 

Acoustic77, 声音77,

Here is the modified queryCourseData method. 这是修改后的queryCourseData方法。

I converted your $.getJSON to $.ajax using async:false (this may or may not have been an issue on my end, so I encourage you to try and set it to true and test whether it works on your end or not). 我使用async:false将$ .getJSON转换为$ .ajax(这可能对我来说不是问题,所以我建议您尝试将其设置为true并测试它是否对您有用) 。

I then noticed that your startTime and endTime are in the format {hour:#,minute:#} while the item.start_time and item.end_time are time strings in 24 hour format. 然后,我注意到您的startTime和endTime的格式为{hour:#,minute:#},而item.start_time和item.end_time是24小时格式的时间字符串。 I wrote some code to convert the former form into 24 hour format ( I am certain there is a more elegant way of doing this than I did). 我写了一些代码将以前的表单转换为24小时格式(我敢肯定有比我更优雅的方法了)。

I also later, after my initial answer, noticed that you were setting myArray to [] every step of your inner for loops where you are constructing the ReqcourseArray and OptcourseArrays. 后来,在我最初的回答之后,我还注意到您正在将myArray设置为内部for循环的每个步骤,在其中构造ReqcourseArray和OptcourseArrays。 Moving var myArray=[] outside of the inner for was my final fix. 我的最终解决是将var myArray = []移到内部之外。

I left my console.log's in place so you could see the results. 我将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];

}

The results of my testing are as follows: 我的测试结果如下:

Test Case: 测试用例:

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

Results: 结果:

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-- 

Test Case: 测试用例:

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

Results: 结果:

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--

Please let me know if this helps :) 请让我知道这可不可以帮你 :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM