Mise en garde:
question s'applique toujours aux
for…of
boucles.> Ne pas utiliserfor…in
pour itérer sur un tableau , utilisez-le pour itérer sur les propriétés d'un objet. Cela dit, ce
Je comprends que la for…in
syntaxe de base en JavaScript ressemble à ceci:
for (var obj in myArray) {
// ...
}
Mais comment obtenir le compteur / index de boucle ?
Je sais que je pourrais probablement faire quelque chose comme:
var i = 0;
for (var obj in myArray) {
alert(i)
i++
}
Ou même le bon vieux:
for (var i = 0; i < myArray.length; i++) {
var obj = myArray[i]
alert(i)
}
Mais je préfère utiliser la for-in
boucle plus simple . Je pense qu'ils sont plus beaux et plus sensés.
Existe-t-il une manière plus simple ou plus élégante?
En Python, c'est simple:
for i, obj in enumerate(myArray):
print i
javascript
for-loop
foreach
counter
hobbes3
la source
la source
alert(obj)
,?Réponses:
for…in
itère sur les noms de propriété, pas sur les valeurs, et le fait dans un ordre non spécifié (oui, même après ES6). Vous ne devez pas l'utiliser pour parcourir les tableaux. Pour eux, il y a laforEach
méthode ES5 qui transmet à la fois la valeur et l'index à la fonction que vous lui donnez:Ou ES6
Array.prototype.entries
, qui prend désormais en charge les versions de navigateur actuelles:Pour les itérables en général (où vous utiliseriez une
for…of
boucle plutôt qu'unefor…in
), il n'y a cependant rien de intégré:démo
Si vous vouliez réellement
for…in
- énumérer les propriétés - vous auriez besoin d'un compteur supplémentaire.Object.keys(obj).forEach
pourrait fonctionner, mais il ne comprend que ses propres propriétés;for…in
inclut des propriétés énumérables n'importe où sur la chaîne du prototype.la source
let
s sont desvar
s avec une portée de bloc.const
s sont immuables.%d
formate un entier et%s
formate une chaîne. Ils sont basés sur printf . Une spécification est en cours sur console.spec.whatwg.org/#formatter .Dans ES6, il est bon d'utiliser la boucle for-of. Vous pouvez obtenir un index pour comme ceci
Notez que
Array.entries()
retourne un itérateur , ce qui lui permet de fonctionner dans la boucle for-of; ne confondez pas cela avec Object.entries () , qui retourne un tableau de paires clé-valeur.la source
entries()
retourne un objet vide:{}
. Une idée pourquoi ce serait? Myarray
est un tableau d'objets.Object.entries(array)
au lieu dearray.entries()
next()
méthode qui retournera les entrées suivantes dans le tableau chaque fois qu'il sera appelé. Il n'y a aucune donnée (visible) dedans; vous obtenez les données dans l'objet sous-jacent en appelantnext()
, ce qui fait for-of dans les coulisses. cc @tonygQue dis-tu de ça
Où
array.forEach
cette méthode a unindex
paramètre qui est l'index de l'élément en cours de traitement dans le tableau.la source
break
n'est pas disponible.Solution pour les collections de petites baies:
arr - ARRAY, obj - KEY of current element, i - COUNTER / INDEX
Remarque: les clés de méthode () ne sont pas disponibles pour IE version <9, vous devez utiliser le code Polyfill . https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
la source
var i = 0;
ili++;
est plus court et plus efficace. De plus, cela ne fonctionne pas pour les propriétés énumérables qui ne sont pas des propriétés propres.Les boucles en boucle parcourent les propriétés d'un objet. Ne les utilisez pas pour les tableaux, même s'ils fonctionnent parfois.
Les propriétés des objets n'ont alors pas d'index, elles sont toutes égales et n'ont pas besoin d'être parcourues dans un ordre déterminé. Si vous souhaitez compter les propriétés, vous devrez configurer le compteur supplémentaire (comme vous l'avez fait dans votre premier exemple).
boucle sur un tableau:
boucle sur un objet:
la source
(var i=0; i<a.length; i++)
comme des ressources gaspillées. Utilisation(var i=0, var len = a.length; i<len; i++)
var i=0; i<a.length; i++)
c'est de toute façon le modèle de boucle standard optimisé par chaque moteur javascript décent.var i=0; i<a.length; i++
c'est la meilleure pratique.Comme d'autres l'ont dit, vous ne devriez pas utiliser for..in pour parcourir un tableau.
Si vous voulez une syntaxe plus propre, vous pouvez utiliser forEach:
Si vous souhaitez utiliser cette méthode, assurez-vous d'inclure le module d'interface ES5 pour ajouter la prise en charge des anciens navigateurs.
la source
La réponse donnée par rushUp est correcte mais ce sera plus pratique
la source
Voici une fonction
eachWithIndex
qui fonctionne avec tout ce qui est itérable.Vous pouvez également écrire une fonction similaire
eachWithKey
qui fonctionne avec des objets utilisantfor...in
.La bonne chose avec les générateurs est qu'ils sont paresseux et peuvent prendre comme argument le résultat d'un autre générateur.
la source
C'est ma version d'un itérateur composite qui produit un index et la valeur de toute fonction de générateur passée avec un exemple de recherche principale (lente):
la source
eachWithIndex[Symbol.iterator]
au lieu d'une simple fonctioneachWithIndex
?eachWithIndex
ne satisfait pas l'interface itérable, ce qui est tout l'intérêt deSymbol.iterator
.eachWithIndex
pour accepter l'itérable et renvoyer un itérable composite fermé.En plus des très bonnes réponses que tout le monde a postées, je veux ajouter que la solution la plus performante est l'ES6
entries
. Cela semble contre-intuitif pour de nombreux développeurs ici, alors j'ai créé ce benchamrk de perf .C'est ~ 6 fois plus rapide. Principalement parce qu'il n'est pas nécessaire: a) d'accéder au tableau plus d'une fois et, b) de lancer l'index.
la source