繁体   English   中英

为什么不填充我的阵列?

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

我有一个返回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);
} 

声音77,

这是修改后的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--

请让我知道这可不可以帮你 :)

暂无
暂无

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

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