Угловой JS перерыв по каждому элементу



У меня есть угловой цикл foreach, и я хочу вырваться из цикла, если я соответствую значению. Следующий код не работает.



angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});


Как я могу получить это?

512   18  

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% быстрее, чем другие циклы.

For loop break , for loop test result

польза для петли в угловом:

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!')
}

Массив Какой - То Метод-Javascript

насколько я знаю, Angular не предоставляет такую функцию. Вы можете использовать подчеркивание find() функция для этого (это в основном forEach, который выходит из цикла, как только функция возвращает true).

http://underscorejs.org/#find

в частности, вы можете выйти из forEach цикл, и из любого места, бросьте исключение.

try {
   angular.forEach([1,2,3], function(num) {
      if (num === 2) throw Error();
   });
} catch(e) {
    // anything
}

однако, лучше, если вы используете другую библиотеку или реализуете свою собственную функцию, a

Если вы используете jQuery (следовательно, не jqLite) в сочетании с AngularJS, вы можете выполнить итерацию с $.каждый - который позволяет разбивать и продолжать на основе логического выражения возвращаемого значения.

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, как вы можете прочитать в 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
})

см.http://api.jquery.com/jquery.each/

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

    Ничего не найдено.