2015-11-16 1 views
0

Я хотел бы проверить каждый объект, если следующий объект имеет 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

Вы хотите, чтобы пропустить текущую итерацию, когда объект не определен? – AtheistP3ace

+0

Проверьте и посмотрите, есть ли 'Object.key (root.objectArr) 'существует –

+0

Да, поэтому внутри оператора if должно быть еще несколько строк кода, которые проверяют, существует ли последний объект в массиве, и если это так, следующий объект будет проигнорирован. Таким образом, последний элемент будет отображаться также на мой взгляд. – Caspert

ответ

2

Добавить дополнительную проверку в свой первый if.
Заменить:

С:

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

To:

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

Upvote существует, потому что вы проверяете существование фактического объекта, прежде чем пытаться прочитать свойство из него, что является правильным ответом. Однако я не согласен со всем объяснением, которое вы дали, которое является ничем, если это имеет смысл, например. * Почему это работает? что в любом случае было ошибкой? * Это обычно помогает OP * понять * проблему, а не просто * исправить ее и вернуться позже с более чем одним и тем же * :) – SidOfc

+0

_ «все объяснение, которое вы дали, которое равно никому» _. Я уже добавил небольшой комментарий во втором блоке кода. – Cerbrus

+0

По-прежнему получает ту же ошибку 'Uncaught TypeError: Невозможно прочитать свойство timeTrigger 'undefined'. Я уже проверяю, существует ли следующий объект с: 'root.objectArr [i + 1] .timeTrigger! = Undefined' – Caspert

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

} 
0

Не забудьте поместить в несколько кода, как это возможно внутри петли. Это пустая трата ресурсов, чтобы поставить предложение if, которое будет выполняться 20 раз, если массив содержит 20 элементов. Вместо этого:

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 и я вместо этого, так что не бесполезная -1 операция в состоянии передачи контура в. Но вы можете обнаружить его менее интуитивным.

for(var i=1; i < arr.length; ++i) { 
    // do stuff with arr[i-1] and arr[i]; 
} 
0

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.

Однако, это становится очень многословным. Я бы предложил извлечь некоторые локальные переменные, чтобы он стал более понятным.

Пример:

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. 
Смежные вопросы