Angular JS break ForEach
У меня есть цикл angular foreach, и я хочу выйти из цикла, если я соответствует значению. Следующий код не работает.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Как я могу это получить?
Ответы
Ответ 1
Нет никакого способа сделать это. См. 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;
}
}
});
Ответ 2
Цикл angular.forEach
не может сломаться при совпадении условий.
Мой личный совет - использовать цикл NATIVE FOR вместо angular.forEach
.
Цикл NATIVE FOR находится вокруг 90% быстрее, чем другие для циклов.
![For loop break , for loop test result]()
ИСПОЛЬЗОВАТЬ 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.');
}
Ответ 3
используйте некоторые или все экземпляры 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/
Ответ 4
Использовать метод массива
var exists = [0,1,2].some(function(count){
return count == 1
});
exists вернет true, и вы можете использовать это как переменную в своей функции
if(exists){
console.log('this is true!')
}
Array Some Method - Javascript
Ответ 5
Насколько я знаю, Angular не предоставляет такую функцию. Вы можете использовать функцию подчеркивания find()
для этого (в основном это forEach, которая выходит из цикла после возвращения функции true).
http://underscorejs.org/#find
Ответ 6
Если вы используете jQuery (следовательно, не jqLite) в сочетании с AngularJS, вы можете выполнять итерации с $.each - что позволяет ломать и продолжать на основе выражения логического возвращаемого значения.
JSFiddle:
http://jsfiddle.net/JEcD2/1/
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
Ответ 7
Конкретно, вы можете выйти из цикла forEach
и любого места, выбросить исключение.
try {
angular.forEach([1,2,3], function(num) {
if (num === 2) throw Error();
});
} catch(e) {
// anything
}
Однако, если вы используете другую библиотеку или реализуете свою собственную функцию, функция find
в этом случае, поэтому ваш код является наиболее высокоуровневым.
Ответ 8
Как утверждают другие ответы, Angular не предоставляет эту функцию. Однако jQuery, и если вы загрузили jQuery, а также Angular, вы можете использовать
jQuery.each ( array, function ( index, value) {
if(condition) return false; // this will cause a break in the iteration
})
См. http://api.jquery.com/jquery.each/
Ответ 9
Обычно нет возможности разбить "каждый" цикл в 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.')
}
Ответ 10
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
}
});
Ответ 11
Вы можете использовать это:
var count = 0;
var arr = [0,1,2];
for(var i in arr){
if(count == 1) break;
//console.log(arr[i]);
}
Ответ 12
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)
}
}
});
});
Ответ 13
Попробуйте это как break;
angular.forEach([0,1,2], function(count){
if(count == 1){
return true;
}
});
Ответ 14
$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;
});
}
Ответ 15
Я бы предпочел сделать это по возвращении. Поместите циклическую часть в частную функцию и верните, когда вы хотите разбить цикл.
Ответ 16
Этот пример работает. Попробуйте.
var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
if(i === 1){
break;
}
}
Ответ 17
Я понимаю, что это старый, но фильтр массива может делать то, что вам нужно:
var arr = [0, 1, 2].filter(function (count) {
return count < 1;
});
Затем вы можете запустить arr.forEach
и другие функции массива.
Я понимаю, что если вы намерены полностью сократить операции цикла, это, вероятно, не сделает то, что вы хотите. Для этого лучше всего использовать while
.
Ответ 18
Я бы использовал return
вместо break
.
angular.forEach([0,1,2], function(count){
if(count == 1){
return;
}
});
Работает как шарм.
Ответ 19
Просто добавьте $index и выполните следующие действия:
angular.forEach([0,1,2], function(count, $index) {
if($index !== 1) {
// do stuff
}
}