У меня есть цикл angular foreach, и я хочу выйти из цикла, если я соответствует значению. Следующий код не работает.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Как я могу это получить?
У меня есть цикл angular foreach, и я хочу выйти из цикла, если я соответствует значению. Следующий код не работает.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Как я могу это получить?
Нет никакого способа сделать это. См. 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;
}
}
});
Цикл angular.forEach
не может сломаться при совпадении условий.
Мой личный совет - использовать цикл NATIVE FOR вместо angular.forEach
.
Цикл NATIVE FOR находится вокруг 90% быстрее, чем другие для циклов.
ИСПОЛЬЗОВАТЬ FOR loop IN ANGULAR:
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 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).
Если вы используете jQuery (следовательно, не jqLite) в сочетании с AngularJS, вы можете выполнять итерации с $.each - что позволяет ломать и продолжать на основе выражения логического возвращаемого значения.
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 рекомендует использовать как нативные функции Array.some, так и Array.every, поскольку вы можете прочитать в нативной документации forEach:
"Невозможно остановить или прервать цикл forEach. Решение - использовать Array.every или Array.some"
Следующие примеры предоставлены MDN:
Array.some:
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
Array.every:
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
Конкретно, вы можете выйти из цикла forEach
и любого места, выбросить исключение.
try {
angular.forEach([1,2,3], function(num) {
if (num === 2) throw Error();
});
} catch(e) {
// anything
}
Однако, если вы используете другую библиотеку или реализуете свою собственную функцию, функция find
в этом случае, поэтому ваш код является наиболее высокоуровневым.
Как утверждают другие ответы, Angular не предоставляет эту функцию. Однако jQuery, и если вы загрузили jQuery, а также Angular, вы можете использовать
jQuery.each ( array, function ( index, value) {
if(condition) return false; // this will cause a break in the iteration
})
Обычно нет возможности разбить "каждый" цикл в 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.')
}
break
невозможно достичь в angular 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)
}
}
});
});
Попробуйте это как 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 array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
if(i === 1){
break;
}
}
Я понимаю, что это старый, но фильтр массива может делать то, что вам нужно:
var arr = [0, 1, 2].filter(function (count) {
return count < 1;
});
Затем вы можете запустить arr.forEach
и другие функции массива.
Я понимаю, что если вы намерены полностью сократить операции цикла, это, вероятно, не сделает то, что вы хотите. Для этого лучше всего использовать while
.
Я бы использовал return
вместо break
.
angular.forEach([0,1,2], function(count){
if(count == 1){
return;
}
});
Работает как шарм.
Просто добавьте $index и выполните следующие действия:
angular.forEach([0,1,2], function(count, $index) {
if($index !== 1) {
// do stuff
}
}