如果下一个对象有timeTrigger,我想检查每个对象。如果有的话,但是当脚本位于倒数第二个对象时,它会给我一个Uncaught TypeError: Cannot read property 'timeTrigger' of undefined
的错误。我如何进行异常,如果数组中没有下一个对象,它仍会在if语句中执行该操作?
var index = 0;
// Loop through array of data (JSON data) and check if timeTrigger exists
for (var i = 0; i < root.objectArr.length; i++) {
var timeTrigger = root.objectArr[i].timeTrigger;
// console.log(timeTrigger);
index++;
if (curVideoTime >= root.objectArr[i].timeTrigger && (root.objectArr[i + 1].timeTrigger != undefined && curVideoTime < root.objectArr[i + 1].timeTrigger) ) {
if (root.objectArr[i].timeTrigger != root.triggeredId) {
root.triggeredId = root.objectArr[i].timeTrigger;
dataController.triggeredEvent(index, timeTrigger);
}
}
// If curVideoTime 5sec == call function
if (curVideoTime > root.objectArr[i].timeTrigger && root.objectArr[i + 1].timeTrigger < curVideoTime) dataController.previousEvents(timeTrigger);
if (curVideoTime < root.objectArr[i].timeTrigger) dataController.nextEvents(timeTrigger);
}
答案 0 :(得分:2)
在您的第一个if
中添加额外的支票
替换:
if (curVideoTime >= root.objectArr[i].timeTrigger &&
(root.objectArr[i + 1].timeTrigger != undefined &&
curVideoTime < root.objectArr[i + 1].timeTrigger)) {
使用:
if (root.objectArr[i + 1] && // Check if the next object actually exists.
curVideoTime >= root.objectArr[i].timeTrigger &&
(root.objectArr[i + 1].timeTrigger != undefined &&
curVideoTime < root.objectArr[i + 1].timeTrigger)) {
哦,你不需要()
围绕最后一个“和”条件,或root.objectArr[i].
,因为你将timeTrigger
存储在一个变量中:
if (root.objectArr[i + 1] &&
curVideoTime >= timeTrigger &&
root.objectArr[i + 1].timeTrigger != undefined &&
curVideoTime < root.objectArr[i + 1].timeTrigger) {
这是一个微不足道的变化,但它们并非必要。
同时更改此if
:
if (curVideoTime > root.objectArr[i].timeTrigger && root.objectArr[i + 1].timeTrigger < curVideoTime) dataController.previousEvents(timeTrigger);
要:
if (curVideoTime > timeTrigger && root.objectArr[i + 1] && root.objectArr[i + 1].timeTrigger < curVideoTime) dataController.previousEvents(timeTrigger);
答案 1 :(得分:0)
你可以试试这个。它基本上检查该索引的对象是否存在,如果不存在则跳过当前迭代。
var index = 0;
// Loop through array of data (JSON data) and check if timeTrigger exists
for (var i = 0; i < root.objectArr.length; i++) {
if (!root.objectArr[i]) {
continue;
}
var timeTrigger = root.objectArr[i].timeTrigger;
// console.log(timeTrigger);
index++;
if (curVideoTime >= root.objectArr[i].timeTrigger && (root.objectArr[i + 1].timeTrigger != undefined && curVideoTime < root.objectArr[i + 1].timeTrigger)) {
if (root.objectArr[i].timeTrigger != root.triggeredId) {
root.triggeredId = root.objectArr[i].timeTrigger;
dataController.triggeredEvent(index, timeTrigger);
}
}
// If curVideoTime 5sec == call function
if (curVideoTime > root.objectArr[i].timeTrigger && root.objectArr[i + 1].timeTrigger < curVideoTime) dataController.previousEvents(timeTrigger);
if (curVideoTime < root.objectArr[i].timeTrigger) dataController.nextEvents(timeTrigger);
}
答案 2 :(得分:0)
请记住将尽可能少的代码置于循环中。如果数组有20个元素,那么放置一个将运行20次的if子句会浪费资源。代替:
for(var i=0; i < arr.length-1; ++i) {
// do stuff with arr[i] and arr[i+1];
}
if(arr.length > 0) {
// do stuff with last cell, arr[arr.length-1]
}
我更喜欢使用i-1和i,因此在循环条件下没有无用的-1操作。但你可能会发现它不太直观。
for(var i=1; i < arr.length; ++i) {
// do stuff with arr[i-1] and arr[i];
}
答案 3 :(得分:0)
AGM, GM, Office, Senior Officer, etc
超出了数组的范围。 GM, AGM, Senior Officer, Officer
未定义,您正在尝试访问root.objectArr[i + 1].timeTrigger == undefined
。您需要验证root.objectArr[i + 1]
未定义为timeTrigger
。
然而,这变得非常冗长。我建议提取一些局部变量,以便更清楚。
示例:强>
root.objectArr[i + 1]
输出
root.objectArr[i + 1] && root.objectArr[i + 1].timeTrigger == undefined