J'ai une boucle foreach angulaire et je veux rompre la boucle si je correspond à une valeur. Le code suivant ne fonctionne pas.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Comment puis-je l'obtenir?
J'ai une boucle foreach angulaire et je veux rompre la boucle si je correspond à une valeur. Le code suivant ne fonctionne pas.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Comment puis-je l'obtenir?
Réponses:
Il n'y a aucun moyen de le faire. Voir https://github.com/angular/angular.js/issues/263 . Selon ce que vous faites, vous pouvez utiliser un booléen pour ne pas entrer dans le corps de la boucle. Quelque chose comme:
var keepGoing = true;
angular.forEach([0,1,2], function(count){
if(keepGoing) {
if(count == 1){
keepGoing = false;
}
}
});
!keepGoing && return;
en haut de la fonction, moins de code.
La angular.forEach
boucle ne peut pas se rompre lors d'une correspondance de condition.
Mon conseil personnel est d'utiliser une boucle NATIVE FOR au lieu de angular.forEach
.
La boucle NATIVE FOR est environ 90% plus rapide que les autres boucles for.
UTILISER POUR boucle en ANGULAIRE:
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.');
}
veuillez utiliser certaines ou toutes les instances 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.
Exemple pour certains:
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
ary.some(function (value, index, _ary) {
console.log(index + ": " + value);
return value === "JavaScript";
});
Exemple pour chaque:
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
ary.every(function(value, index, _ary) {
console.log(index + ": " + value);
return value.indexOf("Script") > -1;
});
Trouvez plus d'informations
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/
Utilisez la méthode Array Some
var exists = [0,1,2].some(function(count){
return count == 1
});
existe renverra true, et vous pouvez l'utiliser comme variable dans votre fonction
if(exists){
console.log('this is true!')
}
angular.forEach()
est que je dois prendre en charge IE8, qui n'a pas Array.forEach()
... ou Array.some()
.
Pour autant que je sache, Angular ne fournit pas une telle fonction. Vous pouvez utiliser des soulignementsfind()
fonction pour cela (c'est essentiellement un forEach qui sort de la boucle une fois que la fonction retourne true).
Si vous utilisez jQuery (donc pas jqLite) en conjonction avec AngularJS, vous pouvez itérer avec $ .each - qui permet de casser et de continuer en fonction de l'expression de la valeur de retour booléenne.
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
}
});
Remarque:
Bien que l'utilisation de jQuery ne soit pas mauvaise, les fonctions natives Array.some ou Array.every sont recommandées par MDN comme vous pouvez le lire dans la documentation native forEach :
"Il n'y a aucun moyen d'arrêter ou de rompre une boucle forEach. La solution consiste à utiliser Array.every ou Array.some"
Les exemples suivants sont fournis par 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
Concrètement, vous pouvez sortir d'une forEach
boucle, et de n'importe quel endroit, lever une exception.
try {
angular.forEach([1,2,3], function(num) {
if (num === 2) throw Error();
});
} catch(e) {
// anything
}
Cependant, il vaut mieux utiliser une autre bibliothèque ou implémenter votre propre fonction, un find
fonction dans ce cas, donc votre code est le plus haut niveau.
Comme les autres réponses l'indiquent, Angular ne fournit pas cette fonctionnalité. jQuery le fait cependant, et si vous avez chargé jQuery ainsi que Angular, vous pouvez utiliser
jQuery.each ( array, function ( index, value) {
if(condition) return false; // this will cause a break in the iteration
})
Normalement, il n'y a aucun moyen de rompre une boucle "each" en javascript. Ce qui peut être fait habituellement est d'utiliser la méthode du "court-circuit".
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
n'est pas possible à réaliser en forEach angulaire, nous devons modifier forEach pour ce faire.
$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()
doit être définie ou si elle fait déjà partie de l'angulaire. Veuillez définir sinon.
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;
});
}
Je préfère le faire par retour. Mettez la partie en boucle dans une fonction privée et revenez quand vous voulez rompre la boucle.
Je me rends compte que c'est vieux, mais un filtre matriciel peut faire ce dont vous avez besoin:
var arr = [0, 1, 2].filter(function (count) {
return count < 1;
});
Vous pouvez ensuite exécuter arr.forEach
et d'autres fonctions de tableau.
Je me rends compte que si vous avez l'intention de réduire complètement les opérations de boucle, cela ne fera probablement pas ce que vous voulez. Pour cela, vous l'utilisez au mieux while
.
Cet exemple fonctionne. Essayez-le.
var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
if(i === 1){
break;
}
}
for
boucle, son cas d'utilisation a besoin d'un foreach
pas for
probablement
Utilisez Retour pour rompre la boucle.
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;
}
}
J'utiliserais return
au lieu de break
.
angular.forEach([0,1,2], function(count){
if(count == 1){
return;
}
});
Fonctionne comme un charme.
Ajoutez simplement $ index et procédez comme suit:
angular.forEach([0,1,2], function(count, $index) {
if($index !== 1) {
// do stuff
}
}