У меня есть цикл 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;
}
}
});
!keepGoing && return;
к началу функции, меньше кода.
Цикл 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.forEach()
является то, что я должен поддерживать IE8, у которого нет Array.forEach()
... или Array.some()
.
Конкретно, вы можете выйти из цикла forEach
и любого места, выбросить исключение.
try {
angular.forEach([1,2,3], function(num) {
if (num === 2) throw Error();
});
} catch(e) {
// anything
}
Однако, если вы используете другую библиотеку или реализуете свою собственную функцию, функция find
в этом случае, поэтому ваш код является наиболее высокоуровневым.
Если вы используете 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
Насколько я знаю, Angular не предоставляет такую функцию. Вы можете использовать функцию подчеркивания find()
для этого (в основном это forEach, которая выходит из цикла после возвращения функции 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
})
Вы можете использовать это:
var count = 0;
var arr = [0,1,2];
for(var i in arr){
if(count == 1) break;
//console.log(arr[i]);
}
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
}
});
break()
или он уже является частью angular. Пожалуйста, определите, если нет.
Попробуйте это как break;
angular.forEach([0,1,2], function(count){
if(count == 1){
return true;
}
});
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)
}
}
});
});
Я бы использовал return
вместо break
.
angular.forEach([0,1,2], function(count){
if(count == 1){
return;
}
});
Работает как шарм.
Я понимаю, что это старый, но фильтр массива может делать то, что вам нужно:
var arr = [0, 1, 2].filter(function (count) {
return count < 1;
});
Затем вы можете запустить arr.forEach
и другие функции массива.
Я понимаю, что если вы намерены полностью сократить операции цикла, это, вероятно, не сделает то, что вы хотите. Для этого лучше всего использовать while
.
Этот пример работает. Попробуйте.
var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
if(i === 1){
break;
}
}
for
, его foreach
использования нуждается в foreach
не for
вероятно,
Я бы предпочел сделать это по возвращении. Поместите циклическую часть в частную функцию и верните, когда вы хотите разбить цикл.
$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;
});
}
Просто добавьте $index и выполните следующие действия:
angular.forEach([0,1,2], function(count, $index) {
if($index !== 1) {
// do stuff
}
}