Tengo un bucle foreach angular y quiero romper el bucle si coincido con un valor. El siguiente código no funciona.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Cómo puedo conseguir esto?
Tengo un bucle foreach angular y quiero romper el bucle si coincido con un valor. El siguiente código no funciona.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Cómo puedo conseguir esto?
Respuestas:
No hay forma de hacer esto. Ver https://github.com/angular/angular.js/issues/263 . Dependiendo de lo que esté haciendo, puede usar un booleano para no entrar en el cuerpo del bucle. Algo como:
var keepGoing = true;
angular.forEach([0,1,2], function(count){
if(keepGoing) {
if(count == 1){
keepGoing = false;
}
}
});
!keepGoing && return;
a la parte superior de la función, menos código.
El angular.forEach
bucle no puede romperse en una coincidencia de condición.
Mi consejo personal es usar un bucle NATIVE FOR en lugar de angular.forEach
.
El bucle NATIVE FOR es aproximadamente un 90% más rápido que otro para los bucles.
USO PARA lazo en 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.');
}
utilice algunas o todas las instancias de 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.
Ejemplo para algunos:
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
ary.some(function (value, index, _ary) {
console.log(index + ": " + value);
return value === "JavaScript";
});
Ejemplo para cada:
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
ary.every(function(value, index, _ary) {
console.log(index + ": " + value);
return value.indexOf("Script") > -1;
});
Encuentre más información
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/
Utilice la matriz algún método
var exists = [0,1,2].some(function(count){
return count == 1
});
Existe devolverá verdadero, y puede usar esto como una variable en su función
if(exists){
console.log('this is true!')
}
angular.forEach()
es que tengo que soportar IE8, que no tiene Array.forEach()
... o Array.some()
.
Hasta donde yo sé, Angular no proporciona esa función. Es posible que desee utilizar la find()
función de subrayado para esto (es básicamente un forEach que se sale del bucle una vez que la función devuelve verdadero).
Si usa jQuery (por lo tanto, no jqLite) junto con AngularJS, puede iterar con $ .each, lo que permite dividir y continuar según la expresión de valor de retorno booleano.
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
}
});
Nota:
Aunque el uso de jQuery no es malo, MDN recomienda tanto las funciones nativas Array.some como Array.Cada una de las siguientes :
"No hay forma de detener o romper un ciclo forEach. La solución es usar Array.every o Array.some"
MDN proporciona los siguientes ejemplos:
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
Concretamente, puede salir de un forEach
bucle, y de cualquier lugar, lanzar una excepción.
try {
angular.forEach([1,2,3], function(num) {
if (num === 2) throw Error();
});
} catch(e) {
// anything
}
Sin embargo, es mejor si usa otra biblioteca o implementa su propia función, una find
función en este caso, por lo que su código es de alto nivel.
Como dicen las otras respuestas, Angular no proporciona esta funcionalidad. Sin embargo, jQuery sí lo hace, y si ha cargado jQuery y Angular, puede usar
jQuery.each ( array, function ( index, value) {
if(condition) return false; // this will cause a break in the iteration
})
Normalmente no hay forma de romper un "cada" bucle en javascript. Lo que se puede hacer generalmente es usar el método de "cortocircuito".
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
no es posible lograrlo en angular para cada uno, necesitamos modificar for cada para hacer eso.
$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()
es necesario definirlo o si ya forma parte de angular. Por favor defina si no.
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)
}
}
});
});
$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;
});
}
Preferiría hacer esto a cambio. Coloque la parte de bucle en la función privada y regrese cuando desee romper el bucle.
Me doy cuenta de que esto es antiguo, pero un filtro de matriz puede hacer lo que necesita:
var arr = [0, 1, 2].filter(function (count) {
return count < 1;
});
Luego puede ejecutar arr.forEach
y otras funciones de matriz.
Me doy cuenta de que si tiene la intención de reducir por completo las operaciones de bucle, esto probablemente no hará lo que desea. Para eso mejor uso while
.
Este ejemplo funciona. Intentalo.
var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
if(i === 1){
break;
}
}
for
bucle, su caso de uso necesita un foreach
no for
probablemente
Use Retorno para romper el ciclo.
angular.forEach([0,1,2], function(count){
if(count == 1) {
return;
}
});
onSelectionChanged(event) {
let selectdata = event['api']['immutableService']['gridOptionsWrapper']['gridOptions']['rowData'];
let selected_flag = 0;
selectdata.forEach(data => {
if (data.selected == true) {
selected_flag = 1;
}
});
if (selected_flag == 1) {
this.showForms = true;
} else {
this.showForms = false;
}
}
Yo usaría en return
lugar de break
.
angular.forEach([0,1,2], function(count){
if(count == 1){
return;
}
});
Funciona de maravilla.
Simplemente agregue $ index y haga lo siguiente:
angular.forEach([0,1,2], function(count, $index) {
if($index !== 1) {
// do stuff
}
}