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

Javascript 如何为数组中的最后一个对象创建异常?,javascript,Javascript,我想检查每个对象下一个对象是否有timeTrigger。如果这样做,但当脚本位于最后一个对象的第二个对象时,它将给我一个错误uncaughttypeerror:cannotreadproperty'timeTrigger'of undefined。如果数组中没有下一个对象,它仍将在if语句中执行操作,那么如何创建异常 var index = 0; // Loop through array of data (JSON data) and check if timeTrigger

我想检查每个对象下一个对象是否有timeTrigger。如果这样做,但当脚本位于最后一个对象的第二个对象时,它将给我一个错误
uncaughttypeerror:cannotreadproperty'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);

        }
var指数=0;
//循环遍历数据数组(JSON数据)并检查timeTrigger是否存在
for(var i=0;i=root.objectArr[i].timeTrigger&&(root.objectArr[i+1].timeTrigger!=undefined&&curVideoTimeroot.objectArr[i].timeTrigger&&root.objectArr[i+1].timeTrigger
如果的话,在第一次
中添加一个额外的检查
替换:

这是一个微不足道的变化,但它们不是必要的


如果出现以下情况,也要更改此

if (curVideoTime > root.objectArr[i].timeTrigger && root.objectArr[i + 1].timeTrigger < curVideoTime) dataController.previousEvents(timeTrigger);
if(curVideoTime>root.objectArr[i]。timeTrigger&&root.objectArr[i+1]。timeTrigger
致:

if(curVideoTime>timeTrigger&&root.objectArr[i+1]&&root.objectArr[i+1].timeTrigger
您可以试试这个。它基本上检查该索引的对象是否存在,如果不存在,则跳过当前迭代

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

}
var指数=0;
//循环遍历数据数组(JSON数据)并检查timeTrigger是否存在
for(var i=0;i=root.objectArr[i].timeTrigger&&(root.objectArr[i+1].timeTrigger!=undefined&&curVideoTimeroot.objectArr[i].timeTrigger&&root.objectArr[i+1].timeTrigger
记住在循环中放入尽可能少的代码。如果数组有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]
}
for(变量i=0;i0){
//用最后一个单元格填充,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];
}
for(变量i=1;i
root.objectArr[i+1]。timeTrigger==undefined
超出了数组的边界
root.objectArr[i+1]
未定义,您正试图在其上访问
timeTrigger
。您需要验证
root.objectArr[i+1]
不是像
root.objectArr[i+1]&&root.objectArr[i+1]那样未定义的。timeTrigger==未定义的

然而,这变得非常冗长。我建议提取一些局部变量以便更清晰

示例:

function log(str) {
    var entry = document.createElement('pre');
    entry.innerText = str;
    document.body.appendChild(entry);
}

var withTrigger = {
    timeTrigger: true
};

var root = {
    objectArr: [withTrigger, withTrigger, withTrigger, undefined, withTrigger]
};

function example() {
    var lastIndex = root.objectArr.length - 1;

    for (var i = 0; i < root.objectArr.length; i++) {
        var currentItem = root.objectArr[i];
        var nextItem = root.objectArr[i + 1];
        var entry = "";

        if (currentItem && currentItem.timeTrigger) {
            entry += "Current; i=" + i + " timeTriger=true";
        } else {
            entry += "Current; i=" + i + " timeTriger=false";
        }

        entry += "\n";

        if (nextItem && nextItem.timeTrigger) {
            entry += "Next; i+1=" + (i + 1) + " timeTriger=true";
        } else if (i == lastIndex) {
            entry += "Next; Out of bounds.";
        } else {
            entry += "Next; i+1=" + (i + 1) + " timeTriger=false";
        }

        entry += "\n"

        log(entry);
    }
}

example();

如果对象未定义,是否要跳过当前迭代?请检查
object.key(root.objectArr)
是否存在,因此if语句中应该有更多的代码行,检查数组中的最后一个对象是否存在,如果存在,则忽略下一个对象。因此最后一项也将显示在我的视图中。upvote的存在是因为在试图从中读取属性之前,您正在检查实际对象的存在,这是正确的答案,但是我不同意您给出的完整解释,如果这是有意义的,则没有解释,例如,为什么这样做?到底怎么了这通常有助于OP了解问题,而不仅仅是解决问题,稍后再回来时会给出更多相同的解释:)“你给出的全部解释都是没有的”。我已经在第二个代码块中添加了一个小注释。仍然得到相同的错误
uncaughttypeerror:cannotreadproperty'timeTrigger'of undefined
。我已经检查下一个对象是否存在:
root.objectArr[I+1].timeTrigger!=未定义的
@Caspert在这种情况下,可能不是每个对象都有
timeTrigger
属性,通过编辑
root.objectArr[i+1]&
root.objectArr[i+1]&&root.objectArr[i+1]进一步扩展检查.timeTrigger&
就像你说的@Cerbrus:small comment-我不认为这算是我书中的一个解释,那就是“在调用对象的属性之前,你必须检查对象是否存在,否则你可能会得到未定义的错误”-注意,有些人可能仍然是JS^的新手。^当然答案不错!
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);

}
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]
}
for(var i=1; i < arr.length; ++i) {
  // do stuff with arr[i-1] and arr[i];
}
function log(str) {
    var entry = document.createElement('pre');
    entry.innerText = str;
    document.body.appendChild(entry);
}

var withTrigger = {
    timeTrigger: true
};

var root = {
    objectArr: [withTrigger, withTrigger, withTrigger, undefined, withTrigger]
};

function example() {
    var lastIndex = root.objectArr.length - 1;

    for (var i = 0; i < root.objectArr.length; i++) {
        var currentItem = root.objectArr[i];
        var nextItem = root.objectArr[i + 1];
        var entry = "";

        if (currentItem && currentItem.timeTrigger) {
            entry += "Current; i=" + i + " timeTriger=true";
        } else {
            entry += "Current; i=" + i + " timeTriger=false";
        }

        entry += "\n";

        if (nextItem && nextItem.timeTrigger) {
            entry += "Next; i+1=" + (i + 1) + " timeTriger=true";
        } else if (i == lastIndex) {
            entry += "Next; Out of bounds.";
        } else {
            entry += "Next; i+1=" + (i + 1) + " timeTriger=false";
        }

        entry += "\n"

        log(entry);
    }
}

example();
Current; i=0 timeTriger=true
Next; i+1=1 timeTriger=true

Current; i=1 timeTriger=true
Next; i+1=2 timeTriger=true

Current; i=2 timeTriger=true
Next; i+1=3 timeTriger=false

Current; i=3 timeTriger=false
Next; i+1=4 timeTriger=true

Current; i=4 timeTriger=true
Next; Out of bounds.