Réponses:
(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:
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 ).
forEach
:Depuis ECMAScript5, les tableaux ont une forEach
fonction qui facilite le bouclage du tableau:
substr.forEach(function(item) {
// do something with `item`
});
(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).
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(substr, function(index, item) {
// do something with `item` (or `this` is also `item` if you like)
});
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 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.
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. Une for
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(array, callback)
itération de tableau
jQuery.each(array, function(Integer index, Object value){});
itération d'objet
jQuery.each(object, function(string propertyName, object propertyValue){});
exemple :
var substr = [1, 2, 3, 4];
$.each(substr , function(index, val) {
console.log(index, val)
});
var myObj = { firstName: "skyfoot"};
$.each(myObj, function(propName, propVal) {
console.log(propName, propVal);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
pour boucle
for (initialExpression; condition; incrementExpression)
statement
exemple
var substr = [1, 2, 3, 4];
//loop from 0 index to max index
for(var i = 0; i < substr.length; i++) {
console.log("loop", substr[i])
}
//reverse loop
for(var i = substr.length-1; i >= 0; i--) {
console.log("reverse", substr[i])
}
//step loop
for(var i = 0; i < substr.length; i+=2) {
console.log("step", substr[i])
}
pour dans
//dont really wnt to use this on arrays, use it on objects
for(var i in substr) {
console.log(substr[i]) //note i returns index
}
pour de
for(var i of subs) {
//can use break;
console.log(i); //note i returns value
}
pour chaque
substr.forEach(function(v, i, a){
//cannot use break;
console.log(v, i, a);
})
Pas besoin de jquery ici, juste une for
boucle fonctionne:
var substr = currnt_image_list.split(',');
for(var i=0; i< substr.length; i++) {
alert(substr[i]);
}
for
boucle traditionnelleUne 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 la for
boucle la plus minimale possible:
for (;;) {
// Do stuff
}
Bien sûr, vous devrez inclure un if(condition === true) { break; }
ou un if(condition === true) { return; }
quelque part à l'intérieur de cette for
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:
for (var i = 0, length = 10; i < length; i++) {
console.log(i);
}
for
traditionnelle pour parcourir un tableauLa façon traditionnelle de parcourir un tableau est la suivante:
for (var i = 0, length = myArray.length; i < length; i++) {
console.log(myArray[i]);
}
Ou, si vous préférez boucler en arrière, vous procédez comme suit:
for (var i = myArray.length - 1; i > -1; i--) {
console.log(myArray[i]);
}
Il existe cependant de nombreuses variantes possibles, comme par exemple. celui-là :
for (var key = 0, value = myArray[key], var length = myArray.length; key < length; value = myArray[++key]) {
console.log(value);
}
... ou celui-ci ...
var i = 0, length = myArray.length;
for (; i < length;) {
console.log(myArray[i]);
i++;
}
... ou celui-ci:
var key = 0, value;
for (; value = myArray[key++];){
console.log(value);
}
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!
while
boucleUne alternative à un for
-loop est un while
-loop. Pour parcourir un tableau, vous pouvez procéder comme suit:
var key = 0;
while(value = myArray[key++]){
console.log(value);
}
Remarque :
Comme les for
-loops traditionnels , les while
-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, le while
-loop ci-dessus se comporte exactement de la même manière que ce for
-loop:
for(var key = 0;value = myArray[key++];){
console.log(value);
}
for...in
etfor...of
En JavaScript, vous pouvez également faire ceci:
for (i in myArray) {
console.log(myArray[i]);
}
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 à for...in
, il y a maintenant aussi pour for...of
. L'exemple suivant montre la différence entre une for...of
boucle et une for...in
boucle:
var myArray = [3, 5, 7];
myArray.foo = "hello";
for (var i in myArray) {
console.log(i); // logs 0, 1, 2, "foo"
}
for (var i of myArray) {
console.log(i); // logs 3, 5, 7
}
Remarque :
Vous devez également considérer qu'aucune version d'Internet Explorer ne prend en charge for...of
( Edge 12+ le fait) et cela for...in
nécessite au moins IE10.
Array.prototype.forEach()
Une alternative à For
-loops est Array.prototype.forEach()
, qui utilise la syntaxe suivante:
myArray.forEach(function(value, key, myArray) {
console.log(value);
});
Remarque :
Array.prototype.forEach()
est pris en charge par tous les navigateurs modernes, ainsi que IE9 +.
jQuery.each()
En plus des quatre autres options mentionnées, jQuery avait également sa propre foreach
variation.
Il utilise la syntaxe suivante:
$.each(myArray, function(key, value) {
console.log(value);
});
Utilisez la each()
fonction de jQuery.
Voici un exemple:
$.each(currnt_image_list.split(','), function(index, value) {
alert(index + ': ' + value);
});
Utilisez jQuery each()
. Il existe d'autres façons, mais chacune est conçue à cet effet.
$.each(substr, function(index, value) {
alert(value);
});
Et ne mettez pas de virgule après le dernier chiffre.
Syntaxe ES6 avec fonction flèche et interpolation:
var data=["a","b","c"];
$(data).each((index, element) => {
console.log(`current index : ${index} element : ${element}`)
});
Essaye ça:
$.grep(array, function(element) {
})
Modes d'itération alternatifs à travers un tableau / chaîne avec des effets secondaires
var str = '21,32,234,223';
var substr = str.split(',');
substr.reduce((a,x)=> console.log('reduce',x), 0) // return undefined
substr.every(x=> { console.log('every',x); return true}) // return true
substr.some(x=> { console.log('some',x); return false}) // return false
substr.map(x=> console.log('map',x)); // return array
str.replace(/(\d+)/g, x=> console.log('replace',x)) // return string
.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; ...