2015-12-22 2 views
2

Я пытаюсь вырваться из внутреннего цикла foreach с использованием JavaScript/jQuery.Нарушение внутренней петли foreach

result.history.forEach(function(item) { 
    loop2: 
    item.forEach(function(innerItem) { 
     console.log(innerItem); 
     break loop2; 
    }); 
}); 

Это приводит к ошибке 'Unidentified label loop2'. это, кажется, прямо перед циклом, о чем говорили другие вопросы.

Что я делаю неправильно и как его исправить?

Редактировать: Правильно, петля foreach не может быть разбита таким образом, но может быть использована для циклического цикла. Это работает:

     result.history.forEach(function(item) { 
          loop2: 
          for (var i = 0; i < item.length; i++) { 
           var innerItem = item[i]; 
           console.log(innerItem); 
           break loop2; 
          } 
         }); 
+2

Вы не можете использовать 'break' для этого. – Pointy

+0

http://stackoverflow.com/a/183197/5442132 – miqdadamirali

+0

@miqdadamirali Да, это ссылка, на которую я имею в виду. –

ответ

3

Если вам нужно, чтобы быть в состоянии сломать итерации, использовать .every() вместо .forEach():

someArray.every(function(element) { 
    if (timeToStop(element)) // or whatever 
    return false; 
    // do stuff 
    // ... 
    return true; // keep iterating 
}); 

Вы можете перевернуть логику true/false и использовать .some() вместо; та же основная идея.

+3

Как записка для потомков; это ECMAScript 5.1, поэтому поддержка ниже IE9. – shennan

3

Невозможно это сделать. Согласно MDN:

Невозможно остановить или разбить цикл forEach(), кроме как путем исключения исключения. Если вам нужно такое поведение, метод .forEach() является неправильным инструментом, вместо этого используйте простой цикл. Если вы тестируете элементы массива для предиката и нуждаетесь в логическом возвращаемом значении, вы можете использовать каждый() или some().

+0

Вы не можете сломать цикл 'forEach', но вы всегда можете использовать' .some() 'или' .every() 'вместо этого. – Pointy

Смежные вопросы