[英]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.