Ruptura angular do JS para cada

Eu tenho um loop foreach angular e eu quero quebrar de loop se eu corresponder a um valor. O código a seguir não funciona.

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

Como posso conseguir isso?

Não há como fazer isso. Veja https://github.com/angular/angular.js/issues/263 . Dependendo do que você está fazendo, você pode usar um booleano para não entrar no corpo do loop. Algo como:

 var keepGoing = true; angular.forEach([0,1,2], function(count){ if(keepGoing) { if(count == 1){ keepGoing = false; } } }); 

O loop angular.forEach não pode quebrar em uma correspondência de condição.

Meu conselho pessoal é usar um loop NATIVE FOR ao invés de angular.forEach .

O loop NATIVE FOR é cerca de 90% mais rápido do que outros loops.

Para quebra de loop, para resultado do teste de loop

USE 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.'); } 

por favor, use algumas ou todas as instâncias do 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. 

Exemplo para alguns:

 var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"]; ary.some(function (value, index, _ary) { console.log(index + ": " + value); return value === "JavaScript"; }); 

Exemplo para todos:

 var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"]; ary.every(function(value, index, _ary) { console.log(index + ": " + value); return value.indexOf("Script") > -1; }); 

Encontre mais informações
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/

Use o Array Some Method

  var exists = [0,1,2].some(function(count){ return count == 1 }); 

exists irá retornar true, e você pode usar isso como uma variável em sua function

 if(exists){ console.log('this is true!') } 

Matriz Algum Método – Javascript

Tanto quanto sei, o Angular não oferece essa function. Você pode querer usar a function find() do sublinhado para isso (é basicamente um forEach que quebra o loop quando a function retorna true).

http://underscorejs.org/#find

Concretamente, você pode sair de um loop forEach e, de qualquer lugar, lançar uma exceção.

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

No entanto, é melhor usar outra biblioteca ou implementar sua própria function, uma function find nesse caso, para que seu código seja de nível mais alto.

Se você usar o jQuery (e não o jqLite) em conjunto com o AngularJS, você pode iterar com $ .each – que permite quebrar e continuar com base na expressão do valor de retorno booleano.

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 } }); 

Nota:

Embora o uso do jQuery não seja ruim, as funções nativas Array.some ou Array.every são recomendadas pelo MDN, como você pode ler na documentação nativa de forEach :

“Não há como parar ou interromper um loop forEach. A solução é usar Array.every ou Array.some”

Os exemplos a seguir são fornecidos pelo 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 

Normalmente não há como quebrar um loop “cada” no javascript. O que pode ser feito geralmente é usar o método de “curto-circuito”.

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

Como as outras respostas afirmam, o Angular não oferece essa funcionalidade. jQuery, no entanto, e se você carregou jQuery, bem como Angular, você pode usar

 jQuery.each ( array, function ( index, value) { if(condition) return false; // this will cause a break in the iteration }) 

Veja http://api.jquery.com/jquery.each/

break não é possível alcançar em angular forEach, precisamos modificar para fazer isso.

 $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,eg an empty string } }); 

Você pode usar isto:

 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) } } }); }); 

Este exemplo funciona. Tente.

 var array = [0,1,2]; for( var i = 0, ii = array.length; i < ii; i++){ if(i === 1){ break; } } 

Tente isso como quebra;

 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; }); } 

Eu preferiria fazer isso por retorno. Coloque a parte do loop em uma function privada e retorne quando quiser quebrar o loop.

Eu percebo que isso é antigo, mas um filtro de matriz pode fazer o que você precisa:

 var arr = [0, 1, 2].filter(function (count) { return count < 1; }); 

Você pode então executar arr.forEach e outras funções de matriz.

Percebo que, se você pretende reduzir completamente as operações de loop, isso provavelmente não fará o que você deseja. Para que você use melhor while .

Apenas adicione $ index e faça o seguinte:

 angular.forEach([0,1,2], function(count, $index) { if($index !== 1) { // do stuff } }