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