(Mise à jour: mon autre réponse ici présente les options non jQuery de manière plus approfondie. La troisième option ci-dessous, cependant jQuery.each
, n'y figure pas.)
Quatre options:
Boucle générique:
var i;
for (i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
ou dans ES2015 +:
for (let i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
Avantages : simple, pas de dépendance à jQuery, facile à comprendre, pas de problème avec la préservation de la signification de l' this
intérieur du corps de la boucle, pas de surcharge inutile des appels de fonction (par exemple, en théorie plus rapide, bien qu'en fait vous devriez ont tellement d'éléments que les chances sont que vous auriez d'autres problèmes; détails ).
ES5 forEach
:
Depuis ECMAScript5, les tableaux ont une forEach
fonction qui facilite le bouclage du tableau:
substr.forEach(function(item) {
// do something with `item`
});
Lien vers les documents
(Remarque: il existe de nombreuses autres fonctions, pas seulement forEach
; voir la réponse référencée ci-dessus pour plus de détails.)
Avantages : Déclaratif, peut utiliser une fonction prédéfinie pour l'itérateur si vous en avez une à portée de main, si votre corps de boucle est complexe, la portée d'un appel de fonction est parfois utile, pas besoin de i
variable dans votre portée contenante.
Inconvénients : si vous utilisez this
dans le code conteneur et que vous souhaitez utiliser this
dans votre forEach
rappel, vous devez soit A) le coller dans une variable afin de pouvoir l'utiliser dans la fonction, B) le passer comme deuxième argument à forEach
so forEach
le définit comme this
lors du rappel, ou C) Utilisez une fonction de flèche ES2015 + , qui se ferme this
. Si vous ne faites pas l'une de ces choses, le rappel this
sera undefined
(en mode strict) ou l'objet global ( window
) en mode lâche. Autrefois, il y avait un deuxième inconvénient qui forEach
n'était pas universellement pris en charge, mais ici en 2018, le seul navigateur que vous allez rencontrer qui n'a pas forEach
est IE8 (et il ne peut pas être correctement polyfilled là, soit).
ES2015 + for-of
:
for (const s of substr) { // Or `let` if you want to modify it in the loop body
// do something with `s`
}
Voir la réponse liée en haut de cette réponse pour plus de détails sur la façon dont cela fonctionne.
Avantages : Simple, direct, offre une variable de portée contenue (ou constante, dans ce qui précède) pour l'entrée à partir du tableau.
Inconvénients : non pris en charge dans aucune version d'IE.
jQuery.each:
jQuery.each(substr, function(index, item) {
// do something with `item` (or `this` is also `item` if you like)
});
( Lien vers les documents )
Avantages : Tous les mêmes avantages que forEach
, plus vous savez qu'il est là puisque vous utilisez jQuery.
Inconvénients : Si vous utilisez this
dans le code contenant, vous devez le coller dans une variable afin que vous puissiez l'utiliser dans la fonction, car this
signifie autre chose dans la fonction.
Vous pouvez cependant éviter le this
problème en utilisant $.proxy
:
jQuery.each(substr, $.proxy(function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}, this));
... ou Function#bind
:
jQuery.each(substr, function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}.bind(this));
... ou dans ES2015 ("ES6"), une fonction flèche:
jQuery.each(substr, (index, item) => {
// do something with `item` (`this` is the same as it was outside)
});
À ne PAS faire:
Ne l' utilisez pasfor..in
pour cela (ou si vous le faites, faites-le avec les garanties appropriées). Vous verrez des gens dire (en fait, brièvement il y avait une réponse ici disant cela), mais for..in
ne fait pas ce que beaucoup de gens pensent que cela fait (cela fait quelque chose d'encore plus utile!). Plus précisément, for..in
parcourt les noms de propriété énumérables d'un objet (pas les index d'un tableau). Étant donné que les tableaux sont des objets et que leurs seules propriétés énumérables par défaut sont les index, il semble surtout fonctionner en quelque sorte dans un déploiement fade. Mais ce n'est pas une hypothèse sûre que vous pouvez simplement l'utiliser pour cela. Voici une exploration: http://jsbin.com/exohi/3
Je devrais adoucir le «ne pas» ci-dessus. Si vous avez affaire à des tableaux clairsemés (par exemple, le tableau a 15 éléments au total, mais leurs index sont répartis sur une plage de 0 à 150 000 pour une raison quelconque, et donc length
150 001), et si vous utilisez des protections appropriées comme hasOwnProperty
et en vérifiant le le nom de la propriété est vraiment numérique (voir le lien ci-dessus), for..in
peut être un moyen parfaitement raisonnable d'éviter de nombreuses boucles inutiles, car seuls les index remplis seront énumérés.
.each()
oufor...in
pour boucler sur un tableau est en général une mauvaise idée. C'est comme des âges plus lents que d'utiliserfor
ouwhile
. À l'aide d'un,for loop
c'est même une excellente idée de mettre en cache lalength
propriété avant de boucler.for (var i = 0, len = substr.length; i < len; ...
Function#bind
. :-) Bon point, ajouté.i++
et++i
est le résultat de cette expression, qui n'est jamais utilisée dans l'exemple ci-dessus. Unefor
boucle fonctionne comme ceci: 1. Initialisation, 2. Test (terminer si faux), 3. Corps, 4. Mettre à jour, 5. Revenir à l'étape 2. Le résultat de l'expression de mise à jour n'est utilisé pour rien.jQuery.each ()
jQuery.each ()
itération de tableau
itération d'objet
exemple :
boucles javascript pour le tableau
pour boucle
exemple
pour dans
pour de
pour chaque
Ressources
Boucles et itérateurs MDN
la source
Pas besoin de jquery ici, juste une
for
boucle fonctionne:la source
Option 1: la
for
boucle traditionnelleLes bases
Une
for
boucle traditionnelle a trois composants:Ces trois composants sont séparés l'un de l'autre par un
;
symbole. Le contenu de chacun de ces trois composants est facultatif, ce qui signifie que ce qui suit est lafor
boucle la plus minimale possible:Bien sûr, vous devrez inclure un
if(condition === true) { break; }
ou unif(condition === true) { return; }
quelque part à l'intérieur de cettefor
boucle pour qu'elle cesse de fonctionner.Habituellement, cependant, l'initialisation est utilisée pour déclarer un index, la condition est utilisée pour comparer cet index avec une valeur minimale ou maximale, et la réflexion après coup est utilisée pour incrémenter l'index:
Utilisation d'une boucle
for
traditionnelle pour parcourir un tableauLa façon traditionnelle de parcourir un tableau est la suivante:
Ou, si vous préférez boucler en arrière, vous procédez comme suit:
Il existe cependant de nombreuses variantes possibles, comme par exemple. celui-là :
... ou celui-ci ...
... ou celui-ci:
Celui qui fonctionne le mieux est en grande partie une question de goût personnel et de cas d'utilisation spécifique que vous implémentez.
Remarque :Chacune de ces variantes est supportée par tous les navigateurs, y compris les anciens!
Option 2: la
while
boucleUne alternative à un
Remarque :for
-loop est unwhile
-loop. Pour parcourir un tableau, vous pouvez procéder comme suit:Comme les
for
-loops traditionnels , leswhile
-loops sont pris en charge par les navigateurs les plus anciens.De plus, chaque boucle while peut être réécrite sous forme de
for
boucle. Par exemple, lewhile
-loop ci-dessus se comporte exactement de la même manière que cefor
-loop:Option 3:
for...in
etfor...of
En JavaScript, vous pouvez également faire ceci:
Cependant, cela doit être utilisé avec précaution, car il ne se comporte pas de la même manière qu'une
for
boucle traditionnelle dans tous les cas, et il existe des effets secondaires potentiels qui doivent être pris en considération. Voir Pourquoi l'utilisation de "for ... in" avec l'itération de tableau est une mauvaise idée? pour plus de détails.Comme alternative à
Remarque :for...in
, il y a maintenant aussi pourfor...of
. L'exemple suivant montre la différence entre unefor...of
boucle et unefor...in
boucle:Vous devez également considérer qu'aucune version d'Internet Explorer ne prend en charge
for...of
( Edge 12+ le fait) et celafor...in
nécessite au moins IE10.Option 4:
Array.prototype.forEach()
Une alternative à
Remarque :For
-loops estArray.prototype.forEach()
, qui utilise la syntaxe suivante:Array.prototype.forEach()
est pris en charge par tous les navigateurs modernes, ainsi que IE9 +.Option 5:
jQuery.each()
En plus des quatre autres options mentionnées, jQuery avait également sa propre
foreach
variation.Il utilise la syntaxe suivante:
la source
Utilisez la
each()
fonction de jQuery.Voici un exemple:
la source
Utilisez jQuery
each()
. Il existe d'autres façons, mais chacune est conçue à cet effet.Et ne mettez pas de virgule après le dernier chiffre.
la source
Syntaxe ES6 avec fonction flèche et interpolation:
la source
Vous pouvez utiliser une
for()
boucle:la source
Essaye ça:
la source
Modes d'itération alternatifs à travers un tableau / chaîne avec des effets secondaires
la source