web-dev-qa-db-fra.com

Pause angulaire JS pour chaque

J'ai une boucle foreach angulaire et je veux rompre avec 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? 

242
Sabarish Sankar

Il n'y a aucun moyen de faire ça. Voir https://github.com/angular/angular.js/issues/263 . En fonction de 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;
    }
  }
});
253
dnc253

La boucle angular.forEach ne peut pas être interrompue lors d'une correspondance de conditions.

Mon conseil personnel est d’utiliser une boucle NATIVE FOR au lieu de angular.forEach.

La boucle NATIVE FOR est d'environ 90% plus rapide que les autres boucles for.

For loop break , for loop test result

UTILISATION 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.');
}
285
Nishchit Dhanani

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

Trouver plus d'informations 
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/

22
Neo Vijay

Utilisez le tableau une méthode

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

existe renverra vrai, et vous pouvez l'utiliser comme une variable dans votre fonction

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

Array Some Method - Javascript

17
Aman Fahimullah

Pour autant que je sache, Angular ne fournit pas une telle fonction. Vous voudrez peut-être utiliser la fonction find() de soulignement (c'est en gros un forEach qui se détache de la boucle une fois que la fonction a rendu vrai).

http://underscorejs.org/#find

6
mna

Concrètement, vous pouvez sortir d’une boucle forEach, et de n’importe quel endroit, lancer une exception.

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

Cependant, il est préférable que vous utilisiez une autre bibliothèque ou implémentiez votre propre fonction, une fonction find dans ce cas, afin que votre code soit le plus élevé possible.

6
Victor Aguilar

Si vous utilisez jQuery (et donc pas jqLite) avec AngularJS, vous pouvez effectuer une itération avec $ .each - ce qui permet de casser et de continuer en fonction de l'expression de valeur de retour booléenne.

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

Remarque:

Bien que l'utilisation de jQuery ne soit pas une mauvaise solution, MDN recommande l'utilisation des deux fonctions natives Array.some _ ou Array.every : _ dans la documentation native: forEach

"Il n'y a aucun moyen d'arrêter ou de casser 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
6
conceptdeluxe

Comme l'indique l'autre réponse, Angular ne fournit pas cette fonctionnalité. jQuery le fait cependant, et si vous avez chargé jQuery aussi bien que Angular, vous pouvez utiliser 

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

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

3
Nik Dow

Normalement, il n'y a aucun moyen de casser une boucle "chaque" en javascript. Ce que l’on peut faire est généralement d’utiliser une méthode de "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.')
    }

3
Zhenyang Hua

break n'est pas possible à réaliser dans un angle angulaire pour chaque élément, nous devons modifier pour chaque élément.

$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
                  }
                });
2
rb4bhushan

Vous pouvez utiliser ceci:

var count = 0;
var arr = [0,1,2];
for(var i in arr){
   if(count == 1) break;
   //console.log(arr[i]);
}
2
endrcn

Essayez ceci comme pause. 

angular.forEach([0,1,2], function(count){
  if(count == 1){
    return true;
  }
});
2
panatoni
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)
            }

        }      
    });
});
1
user1693371

Je réalise que c'est vieux, mais un filtre de tableau 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 le nombre d’opérations en boucle, cela ne fera probablement pas ce que vous voulez. Pour cela, utilisez au mieux while.

0
Shoreline

Utilisez Return pour rompre la boucle.

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

J'utiliserais return au lieu de break.

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

Fonctionne comme un charme.

0
Aakash

Cet exemple fonctionne. Essayez-le.

var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
  if(i === 1){
   break;
  }
}
0
Maikel Rosabal
$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;
     });
 }
0
solanki...

Je préférerais le faire par retour. Mettez la partie en boucle dans une fonction privée et revenez quand vous voulez casser la boucle. 

0
praba buddy