265 votes

Angular JS break ForEach

J'ai une boucle foreach angulaire et je veux sortir de la boucle si je trouve une valeur. Le code suivant ne fonctionne pas.

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

Comment puis-je l'obtenir ?

1 votes

Je ne comprends pas pourquoi vous ne trouvez pas simplement la valeur au lieu d'entrer dans une boucle. Peut-être que l'exemple que vous avez donné ne raconte pas toute l'histoire, mais je préférerais faire ce que @Aman a dit ci-dessous. Pourquoi entrer dans la boucle comme mentionné ci-dessous et exécuter une vérification à chaque fois quand some() fait exactement cela d'une manière plus élégante. Rappelez-vous que si vous traitez javascript comme un langage fonctionnel, il n'y a aucun intérêt à utiliser ces structures de contrôle de type for/while/break. C'est pourquoi foreach, find, some, etc. existent.

303voto

Nishchit Dhanani Points 619

El angular.forEach La boucle ne peut pas s'interrompre sur une correspondance de condition.

Mon conseil personnel est d'utiliser un NATIVE POUR au lieu de angular.forEach .

La boucle FOR NATIVE est autour de 90% plus rapidement que les autres boucles for.

For loop break , for loop test result

UTILISER POUR LA BOUCLE EN ANGLE :

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

1 votes

Cela ne fonctionne pas pour moi. Tout ce que ça fait, c'est terminer cette itération particulière de la boucle. Mais ensuite, elle passe à l'itération suivante.

1 votes

@Ben , Désolé ben , C'était mon erreur mais maintenant je mets à jour ma réponse après une longue recherche . J'espère que cela vous aidera. Je vous remercie

0 votes

Ce test dépend de la plateforme. Dans mon cas, le Native FOR était 90% plus lent.

275voto

dnc253 Points 11784

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

46 votes

Je préférerais simplement ajouter un !keepGoing && return; au début de la fonction, moins de code.

47 votes

Ce ne sont pas les meilleures pratiques, ici la boucle angulaire forEach ne se casse jamais, et il n'y a rien pour casser angular.forEach. La boucle for native est environ 90 % plus rapide que angular.forEach . Il est donc préférable d'utiliser la boucle for native lorsque vous souhaitez interrompre la boucle lorsque la condition correspond. Merci

0 votes

C'est exactement là où j'étais coincé... et cela m'a aidé... merci beaucoup... Quoi qu'il en soit, je voudrais savoir pourquoi la boucle forEach est insécable. Si un

19voto

Aman Fahimullah Points 51

Utilisez la méthode Array Some

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

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

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

Méthode Array Some - Javascript

4 votes

Pour moi, la seule raison d'utiliser angular.forEach() c'est que je dois prendre en charge IE8, qui n'a pas Array.forEach() ... ou Array.some() .

2 votes

Vous pouvez facilement polyfill Array.forEach. Voir le bas de la page : developer.mozilla.org/fr/US/docs/Web/JavaScript/Référence/

6voto

PuerkitoBio Points 4721

Pour autant que je sache, Angular ne fournit pas une telle fonction. Vous pouvez utiliser la fonction underscore find() pour cela (il s'agit essentiellement d'un forEach qui sort de la boucle dès que la fonction renvoie vrai).

http://underscorejs.org/#find

0 votes

Cela peut résoudre le problème latéralement, mais ne rompt pas la boucle.

0 votes

Ou boucle for native

6voto

conceptdeluxe Points 733

Si vous utilisez jQuery (donc pas jqLite) en conjonction avec AngularJS, vous pouvez itérer avec $.each - qui permet de rompre et de continuer sur la base de l'expression booléenne de la valeur de retour.

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

Note :

Bien que l'utilisation de jQuery ne soit pas mauvaise, les deux systèmes natifs Array.some o Array.every sont recommandées par MDN, comme vous pouvez le lire à l'adresse suivante : native forEach documentation :

"Il n'y a aucun moyen d'arrêter ou de rompre une boucle forEach. La solution est d'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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X