如何为数组中的最后一个对象创建一个异常?

时间:2015-11-16 15:05:44

标签: javascript

如果下一个对象有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);

        }

4 个答案:

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