18 ответов:
нет никакого способа сделать это. См.https://github.com/angular/angular.js/issues/263. в зависимости от того, что вы делаете, вы можете использовать логическое значение, чтобы просто не входить в тело цикла. Что-то вроде:
var keepGoing = true; angular.forEach([0,1,2], function(count){ if(keepGoing) { if(count == 1){ keepGoing = false; } } });
The
angular.forEachцикл не может прерваться при совпадении условий.мой личный совет-использовать УРОЖЕНЕЦ петли вместо
angular.forEach.родной для цикла вокруг 90% быстрее, чем другие циклы.
польза для петли в угловом:
var numbers = [0, 1, 2, 3, 4, 5]; for (var i = 0, len = numbers.length; i < len; i++) { if (numbers[i] === 1) { console.log('Loop is going to break.'); break; } console.log('Loop will continue.'); }
пожалуйста, используйте некоторые или все экземпляры ForEach,
Array.prototype.some: some is much the same as forEach but it break when the callback returns true Array.prototype.every: every is almost identical to some except it's expecting false to break the loop.пример для некоторых:
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"]; ary.some(function (value, index, _ary) { console.log(index + ": " + value); return value === "JavaScript"; });пример для каждого:
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"]; ary.every(function(value, index, _ary) { console.log(index + ": " + value); return value.indexOf("Script") > -1; });найти дополнительную информацию
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/
использовать массив какой-то метод
var exists = [0,1,2].some(function(count){ return count == 1 });exists вернет true, и вы можете использовать это как переменную в своей функции
if(exists){ console.log('this is true!') }
насколько я знаю, Angular не предоставляет такую функцию. Вы можете использовать подчеркивание
find()функция для этого (это в основном forEach, который выходит из цикла, как только функция возвращает true).
в частности, вы можете выйти из
forEachцикл, и из любого места, бросьте исключение.try { angular.forEach([1,2,3], function(num) { if (num === 2) throw Error(); }); } catch(e) { // anything }однако, лучше, если вы используете другую библиотеку или реализуете свою собственную функцию, a
Если вы используете jQuery (следовательно, не jqLite) в сочетании с AngularJS, вы можете выполнить итерацию с $.каждый - который позволяет разбивать и продолжать на основе логического выражения возвращаемого значения.
JSFiddle:
Javascript:
var array = ['foo', 'bar', 'yay']; $.each(array, function(index, element){ if (element === 'foo') { return true; // continue } console.log(this); if (element === 'bar') { return false; // break } });Примечание:
хотя использование jQuery не плохо, оба родные массив.некоторые или массив.каждый функции рекомендуется MDN, как вы можете прочитать в native forEach документы:
" нет никакого способа остановить или разорвать цикл forEach. Решение заключается в использовании массива.каждый или массив.некоторые"
следующие примеры приведены MDN:
массив.некоторые:
function isBigEnough(element, index, array){ return (element >= 10); } var passed = [2, 5, 8, 1, 4].some(isBigEnough); // passed is false passed = [12, 5, 8, 1, 4].some(isBigEnough); // passed is trueмассив.каждый:
function isBigEnough(element, index, array){ return (element >= 10); } var passed = [12, 5, 8, 130, 44].every(isBigEnough); // passed is false passed = [12, 54, 18, 130, 44].every(isBigEnough); // passed is true
обычно нет способа разорвать цикл "каждый" в javascript. Обычно можно использовать метод "короткого замыкания".
array.forEach(function(item) { // if the condition is not met, move on to the next round of iteration. if (!condition) return; // if the condition is met, do your logic here console.log('do stuff.') }
Как и в других ответах, Angular не предоставляет эту функцию. однако jQuery делает это, и если вы загрузили jQuery, а также Angular, вы можете использовать
jQuery.each ( array, function ( index, value) { if(condition) return false; // this will cause a break in the iteration })
breakневозможно достичь в угловом forEach, нам нужно изменить forEach, чтобы сделать это.$scope.myuser = [{name: "Ravi"}, {name: "Bhushan"}, {name: "Thakur"}]; angular.forEach($scope.myuser, function(name){ if(name == "Bhushan") { alert(name); return forEach.break(); //break() is a function that returns an immutable object,e.g. an empty string } });
вы можете использовать это:
var count = 0; var arr = [0,1,2]; for(var i in arr){ if(count == 1) break; //console.log(arr[i]); }
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"]; var keepGoing = true; ary.forEach(function(value, index, _ary) { console.log(index) keepGoing = true; ary.forEach(function(value, index, _ary) { if(keepGoing){ if(index==2){ keepGoing=false; } else{ console.log(value) } } }); });
этот пример работает. Попробовать его.
var array = [0,1,2]; for( var i = 0, ii = array.length; i < ii; i++){ if(i === 1){ break; } }
попробуйте это как перерыв;
angular.forEach([0,1,2], function(count){ if(count == 1){ return true; } });
$scope.arr = [0, 1, 2]; $scope.dict = {} for ( var i=0; i < $scope.arr.length; i++ ) { if ( $scope.arr[i] == 1 ) { $scope.exists = 'yes, 1 exists'; break; } } if ( $scope.exists ) { angular.forEach ( $scope.arr, function ( value, index ) { $scope.dict[index] = value; }); }
Я бы предпочел сделать это по возвращению. Поместите часть цикла в частную функцию и вернитесь, когда вы хотите разорвать цикл.
Я понимаю, что это старый, но массив фильтр может сделать то, что вам нужно:
var arr = [0, 1, 2].filter(function (count) { return count < 1; });затем вы можете запустить
arr.forEachи другие функции массива.Я понимаю, что если вы намерены сократить цикл операций в целом, это, вероятно, не будет делать то, что вы хотите. Для этого вам лучше всего использовать
while.
просто добавьте $ index и сделайте следующее:
angular.forEach([0,1,2], function(count, $index) { if($index !== 1) { // do stuff } }

Comments