angularjs - index - foreach angular 6
Angular JS romper ForEach (18)
Tengo un bucle foreach angular y quiero interrumpir el bucle si encuentro un valor El siguiente código no funciona.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Cómo puedo conseguir esto?
Como indican las otras respuestas, Angular no proporciona esta funcionalidad. Sin embargo, jQuery sí lo hace, y si ha cargado jQuery además de Angular, puede usar
jQuery.each ( array, function ( index, value) {
if(condition) return false; // this will cause a break in the iteration
})
Concretamente, puede salir de un bucle forEach
, 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 utiliza otra biblioteca o implementa su propia función, una función de find
en este caso, por lo que su código es el más alto nivel.
El bucle angular.forEach
no se puede romper en una condición que coincida.
Mi consejo personal es usar un bucle angular.forEach
FOR en lugar de angular.forEach
.
El bucle NATIVE FOR es aproximadamente un 90% más rápido que otro bucle para los bucles.
USO PARA bucle 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.'');
}
Este ejemplo funciona. Intentalo.
var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
if(i === 1){
break;
}
}
Intenta esto como descanso;
angular.forEach([0,1,2], function(count){
if(count == 1){
return true;
}
});
Me doy cuenta de que esto es antiguo, pero un filtro de matriz puede hacer lo que necesitas:
var arr = [0, 1, 2].filter(function (count) {
return count < 1;
});
A continuación, puede ejecutar arr.forEach
y otras funciones de matriz.
Me doy cuenta de que si pretende reducir por completo las operaciones de bucle, esto probablemente no hará lo que desea. Para eso es mejor usar while
.
No hay manera de hacer esto. Consulte https://github.com/angular/angular.js/issues/263 . Dependiendo de lo que estés haciendo, puedes 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;
}
}
});
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.'')
}
Por favor, use algunos o todos los ejemplos 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;
});
Encontrar mas informacion
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/
Preferiría hacer esto por vuelta. Coloque la parte de bucle en función privada y vuelva cuando desee interrumpir el bucle.
Puedes usar esto:
var count = 0;
var arr = [0,1,2];
for(var i in arr){
if(count == 1) break;
//console.log(arr[i]);
}
Que yo sepa, Angular no proporciona tal función. Es posible que desee utilizar la función find()
del guión bajo para esto (es básicamente un forEach que se sale del bucle una vez que la función devuelve true).
Si usa jQuery (por lo tanto, no jqLite) junto con AngularJS, puede iterar con $ .each, lo que permite romper 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 las funciones nativas Array.some o Array.every , ya que puede leerlas en la documentación nativa de developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… :
"No hay manera de detener o romper un bucle forEach. La solución es utilizar 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
Solo agregue $ index y haga lo siguiente:
angular.forEach([0,1,2], function(count, $index) {
if($index !== 1) {
// do stuff
}
}
Utilice el método de matriz de algunos
var exists = [0,1,2].some(function(count){
return count == 1
});
existe devolverá verdadero, y puedes usar esto como una variable en tu función
if(exists){
console.log(''this is true!'')
}
no es posible lograr una ruptura en angular forEach, necesitamos modificar forEach 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
}
});
$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 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)
}
}
});
});