Comment obtenez-vous le compteur / index de boucle en utilisant une syntaxe pour in-in en JavaScript?

EDIT: N'utilisez pas for-in pour itérer sur une matrice, utilisez-la pour itérer sur la propriété d'un objet. Je garderai cette réponse comme une référence. Merci a tous!

Je comprends la syntaxe de base pour une boucle dans JavaScript, ça ressemble à ceci:

for(var obj in myArray) { } 

Mais comment puis-je 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:

 var i for(i = 0; 1 < myArray.length(); i++) { var obj = myArray[i] alert(i) } 

Mais je préférerais utiliser la boucle for-in plus simple. Je pense qu'ils ont l'air mieux et ont plus de sens.

Mais y a-t-il une manière plus simple ou plus élégante?

En Python c'est facile:

 for i, obj in enumerate(myArray): print i 

for…in itérations sur les noms de propriétés, pas les valeurs. Vous ne devriez pas l'utiliser pour itérer sur des tableaux. Pour eux, il forEach méthode forEach pour forEach méthode qui passe à la fois la valeur et l'indice de la fonction que vous lui donnez:

 var myArray = [123, 15, 187, 32]; myArray.forEach(function (value, i) { console.log('%d: %s', i, value); }); // Outputs: // 0: 123 // 1: 15 // 2: 187 // 3: 32 

Pour les iterables en général (où vous utiliserez un for…of boucle plutôt que for…in un for…in ), il n'y a rien intégré, mais vous pouvez créer votre propre:

 function* enumerate(iterable) { let i = 0; for (const x of iterable) { yield [i, x]; i++; } } for (const [i, obj] of enumerate(myArray)) { console.log(i, obj); } 

Démo

Si vous vouliez vraiment for…in – énumérant les propriétés – vous auriez besoin d'un compteur supplémentaire. Object.keys(obj).forEach peut 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 prototype.

Dans ES6, il est bon d'utiliser pour – de la boucle. Vous pouvez obtenir un index pour ce genre de chose

 for (let [index, val] of array.entries()) { // your code goes here } 

Solution pour petites collections de réseaux:

 for (var obj in arr) { var i = Object.keys(arr).indexOf(obj); } 

Arr – ARRAY, obj – KEY de l'élément actuel, i – COUNTER / INDEX

Remarque: les touches de méthode () ne sont pas disponibles pour la version IE <9, vous devez utiliser le code Polyfill . https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

For-in-loops itérer sur les propriétés d'un objet. Ne les utilisez pas pour Arrays, même s'ils fonctionnent parfois.

Les propriétés de l'objet n'ont donc aucun indice, elles sont toutes égales et ne doivent pas être exécutées 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:

 var a = []; for (var i=0; i<a.length; i++) { i // is the index a[i] // is the item } 

Boucle sur un objet:

 var o = {}; for (var prop in o) { prop // is the property name o[prop] // is the property value - the item } 

Comme d'autres l'ont dit, vous ne devriez pas utiliser pour … faire itérer sur un tableau.

 for ( var i = 0, len = myArray.length; i < len; i++ ) { ... } 

Si vous voulez une syntaxe plus propre, vous pouvez utiliser pour tout:

 myArray.forEach( function ( val, i ) { ... } ); 

Si vous souhaitez utiliser cette méthode, assurez-vous d'inclure la caisse ES5 pour ajouter un support aux navigateurs plus anciens.