[1,2,3].forEach(function(el) {
if(el === 1) break;
});
Comment puis-je faire cela en utilisant la nouvelle forEach
méthode en JavaScript? J'ai essayé return;
, return false;
et break
. break
se bloque et return
ne fait que poursuivre l'itération.
javascript
arrays
Scott Klarenbach
la source
la source
return
bien qu'il poursuive effectivement l'itération, il ignorera tout code qui le suivra dans le bloc. Prenez ce code par exemple:[1,2,3].forEach(function(el) { if(el === 2) { console.log(`Match on 2!`); return; } console.log(el); });
.Leconsole.log(el);
sera ignoré lorsque 2 correspondra.Réponses:
Il n'y a pas intégré dans la capacité à
break
enforEach
. Pour interrompre l'exécution, vous devez lever une exception quelconque. par exemple.Les exceptions JavaScript ne sont pas terriblement jolies. Une
for
boucle traditionnelle pourrait être plus appropriée si vous en avez vraiment besoinbreak
.Utilisation
Array#some
Utilisez plutôt
Array#some
:Cela fonctionne car
some
retournetrue
dès que l'un des rappels, exécuté dans l'ordre du tableau, retournetrue
, court-circuite l'exécution du reste.some
, son inverseevery
(qui s'arrêtera sur areturn false
), etforEach
sont toutes des méthodes ECMAScript Fifth Edition qui devront être ajoutées auxArray.prototype
navigateurs sur lesquels elles sont manquantes.la source
some
etevery
cela devrait être en TOP dans la réponse. Je ne comprends pas pourquoi les gens pensent que c'est moins lisible. C'est juste génial!Array#some
est vraiment sympa. Tout d'abord, sa compatibilité avec la plupart des navigateurs, notamment ie9 et firefox 1.5, fonctionne également très bien. Mon exemple d'utilisation sera de trouver l'index dans un tableau de plages [a, b] où un nombre se situe entre une paire de limite inférieure et de limite supérieure, de tester et de renvoyer true lorsqu'il est trouvé.for..of
serait la prochaine meilleure solution, mais uniquement pour les nouveaux navigateurs.Il y a maintenant un meilleur moyen de le faire dans ECMAScript2015 (aka ES6) en utilisant la nouvelle boucle for of . Par exemple, ce code n'imprime pas les éléments du tableau après le chiffre 5:
De la documentation:
Besoin de l'index dans l'itération? Vous pouvez utiliser
Array.entries()
:la source
entries
. for (const [index, element] of someArray.entries ()) {// ...}Object.entries(myObject)
, puis l'utiliser exactement comme vous utilisez lefor..in
pour le tableau. Notez que les tableaux JS sont essentiellement des objets sous le capot: blog.niftysnippets.org/2011/01/myth-of-arrays.htmlVous pouvez utiliser toutes les méthodes:
ES6
pour l'ancienne prise en charge du navigateur, utilisez:
plus de détails ici .
la source
[1,2,3].every( el => el !== 1 )
every
ce que cela garantit que les appels sont passés en séquence?k
commence à 0 et est incrémenté de 1: http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.everyCitant la documentation MDN de
Array.prototype.forEach()
:Pour votre code (dans la question), comme suggéré par @bobince, utilisez
Array.prototype.some()
plutôt. Il convient très bien à votre cas d'utilisation.la source
Malheureusement, dans ce cas, ce sera beaucoup mieux si vous ne l'utilisez pas
forEach
. Utilisez plutôt unefor
boucle régulière et cela fonctionnera maintenant exactement comme vous vous y attendez.la source
Pensez à utiliser
jquery
laeach
méthode de, car elle permet de retourner une fonction de rappel false à l'intérieur:Les bibliothèques Lodash fournissent également une
takeWhile
méthode qui peut être chaînée avec map / réduire / plier, etc.:la source
D'après votre exemple de code, il ressemble à
Array.prototype.find
ce que vous recherchez: Array.prototype.find () et Array.prototype.findIndex ()la source
Si vous souhaitez utiliser la suggestion de Dean Edward et lancer l'erreur StopIteration pour sortir de la boucle sans avoir à attraper l'erreur, vous pouvez utiliser la fonction suivante (à l' origine d'ici ):
Le code ci-dessus vous donnera la possibilité d'exécuter du code tel que le suivant sans avoir à faire vos propres clauses try-catch:
Une chose importante à retenir est que cela ne mettra à jour la fonction Array.prototype.forEach que si elle existe déjà. S'il n'existe pas déjà, il ne le modifiera pas.
la source
Réponse courte: utilisez
for...break
pour cela ou changez votre code pour éviter de le casserforEach
. N'utilisez pas.some()
ou.every()
pour émulerfor...break
. Réécrivez votre code pour éviter lafor...break
boucle, ou utilisezfor...break
. Chaque fois que vous utilisez ces méthodes commefor...break
alternative, Dieu tue le chaton.Longue réponse:
.some()
et les.every()
deux retournent uneboolean
valeur,.some()
retournetrue
s'il y a un élément pour lequel la fonction passée retournetrue
, chaque retournefalse
s'il y a un élément pour lequel la fonction passée retournefalse
. C'est ce que cela signifie. Utiliser des fonctions pour ce qu'elles ne signifient pas est bien pire que d'utiliser des tableaux pour la mise en page au lieu de CSS, car cela frustre tous ceux qui lisent votre code.De plus, la seule façon possible d'utiliser ces méthodes comme
for...break
alternative est de créer des effets secondaires (changer certains vars en dehors de la.some()
fonction de rappel), et ce n'est pas très différent defor...break
.Donc, utiliser
.some()
ou.every()
commefor...break
alternative à la boucle n'est pas exempt d'effets secondaires, ce n'est pas beaucoup plus propre alorsfor...break
, c'est frustrant, donc ce n'est pas mieux.Vous pouvez toujours réécrire votre code pour qu'il n'y ait pas besoin de le faire
for...break
. Vous pouvez filtrer le tableau à l'aide.filter()
, vous pouvez diviser le tableau à l'aide de.slice()
et ainsi de suite, puis utiliser.forEach()
ou.map()
pour cette partie du tableau.la source
for...break
boucle si vous avez besoin de performances.for
boucle est l'outil le plus d'itération performant que.forEach()
,.any()
,.map()
,.filter()
etc.C'est juste quelque chose que j'ai trouvé pour résoudre le problème ... Je suis presque sûr que cela résout le problème que le demandeur d'origine avait:
Et puis vous l'appeleriez en utilisant:
Renvoyer false à l'intérieur de la fonction de rappel provoquera une interruption. Faites-moi savoir si cela ne fonctionne pas vraiment.
la source
=== false
pourrait être mieux que== false
si vous n'avez pas à renvoyer explicitement true (ou une valeur véridique) pour continuer la boucle, de peur qu'un chemin de contrôle ne retourne une valeur et que la boucle se casse de manière inattendue.Un autre concept que j'ai trouvé:
la source
Array.prototype.forEach()
.for
etbreak
existait bien avant que cette question ne soit posée; le PO recherchait ce comportement en utilisant, le plus fonctionnelforEach
,.for...in
etbreak
.la source
Trouvé cette solution sur un autre site. Vous pouvez envelopper forEach dans un scénario try / catch.
Plus de détails ici: http://dean.edwards.name/weblog/2006/07/enum/
la source
Si vous n'avez pas besoin d'accéder à votre tableau après l'itération, vous pouvez renflouer en définissant la longueur du tableau sur 0. Si vous en avez toujours besoin après votre itération, vous pouvez le cloner à l'aide de la tranche ..
Ou avec un clone:
Ce qui est une bien meilleure solution que de lancer des erreurs aléatoires dans votre code.
la source
array.length
à0
qu'ils appliqueront dans l' itération courante, donc sans doute il est parfois préférable d'utiliserreturn
après cette affectationIl s'agit d'une boucle for, mais conserve la référence d'objet dans la boucle comme une forEach () mais vous pouvez vous séparer.
la source
Comme mentionné précédemment, vous ne pouvez pas casser
.forEach()
.Voici une façon légèrement plus moderne de faire un foreach avec les itérateurs ES6. Vous permet d'accéder directement à
index
/value
lors de l'itération.Production:
Liens
Array.prototype.entries()
la source
Encore une autre approche
la source
J'utilise nullhack à cet effet, il essaie d'accéder à la propriété de
null
, ce qui est une erreur:la source
throw BREAK
?Si vous voulez conserver votre
forEach
syntaxe, c'est un moyen de la garder efficace (bien que pas aussi bonne qu'une boucle for régulière). Recherchez immédiatement une variable qui sait si vous voulez sortir de la boucle.Cet exemple utilise une fonction anonyme pour créer une étendue de fonction autour de
forEach
laquelle vous devez stocker les informations effectuées .Mes deux centimes.
la source
Je ne le sais pas correctement. Il ne s'agit pas de rompre la boucle. C'est un Jugad
la source
Utilisez la
array.prototype.every
fonction, qui vous fournit l'utilitaire pour rompre le bouclage. Voir l'exemple ici la documentation Javascript sur le réseau de développeurs Mozillala source
D'accord avec @bobince, voté positivement.
Aussi, pour info:
Prototype.js a quelque chose à cet effet:
$break
sera intercepté et géré par Prototype.js en interne, interrompant le cycle "each" mais ne générant pas d'erreurs externes.Voir API Prototype.JS pour plus de détails.
jQuery a également un moyen, il suffit de retourner false dans le gestionnaire pour rompre la boucle tôt:
Voir API jQuery pour plus de détails.
la source
Ce n'est pas le plus efficace, car vous faites toujours le cycle de tous les éléments, mais j'ai pensé qu'il pourrait être utile de considérer le très simple:
la source
continue
est un mot-clé, votre code est une erreur de syntaxe.for of
boucle et àbreak;
partir de cela comme d'habitude.vous pouvez suivre le code ci-dessous qui fonctionne pour moi:
la source
Je préfère utiliser
for in
for in
fonctionne un peu commeforEach
, et vous pouvez ajouter la fonction return to exit à l'intérieur. De meilleures performances aussi.la source
Si vous avez besoin de rompre en fonction de la valeur des éléments qui sont déjà dans votre tableau comme dans votre cas (c.-à-d. Si la condition de rupture ne dépend pas de la variable d'exécution qui peut changer après que le tableau se soit vu attribuer ses valeurs d'élément), vous pouvez également utiliser une combinaison de slice () et indexOf () comme suit.
Si vous avez besoin de vous interrompre lorsque forEach atteint «Apple», vous pouvez utiliser
Comme indiqué dans W3Schools.com la méthode slice () renvoie les éléments sélectionnés dans un tableau, en tant que nouvel objet tableau. Le tableau d'origine ne sera pas modifié.
Voir en JSFiddle
J'espère que cela aide quelqu'un.
la source
Vous pouvez créer une variante de
forEach
qui permetbreak
,continue
,return
et mêmeasync
/await
: (exemple écrit dactylographié)Usage:
la source
essayez avec "find":
la source
Oui, il est possible de continuer et de sortir d'une boucle forEach.
Pour continuer, vous pouvez utiliser return, la boucle continuera mais la fonction actuelle se terminera.
Pour quitter la boucle, vous pouvez définir le troisième paramètre sur une longueur de 0, définie sur un tableau vide. La boucle ne continuera pas, la fonction actuelle le fait, vous pouvez donc utiliser "return" pour terminer, comme exit dans une boucle for normale ...
Cette:
imprimera ceci:
la source
Avant, mon code est ci-dessous
J'ai changé en dessous, il a été corrigé.
la source