Itérer sur des objets est une tâche courante en JavaScript, mais connaître la technique correcte pour chaque situation peut rendre votre code plus propre et plus efficace. Cet article explique pourquoi vous ne pouvez pas utiliser for...of directement avec des objets, propose des approches alternatives et fournit les meilleures pratiques pour itérer sur les objets.
En JavaScript, l'itération sur les structures de données est une partie essentielle de la gestion d'ensembles de données complexes. Alors que les tableaux et les chaînes sont des objets itérables, les objets simples (paires clé-valeur) nécessitent des méthodes différentes pour l'itération. Lorsque les développeurs tentent d'utiliser for...of sur des objets, ils rencontrent souvent des problèmes.
La boucle for...of est utilisée pour parcourir des objets itérables comme des tableaux, des chaînes, des cartes et des ensembles. Cependant, les objets JavaScript simples ne sont pas itérables par défaut.
const user = { name: 'John', age: 30 }; for (const value of user) { console.log(value); } // TypeError: user is not iterable
Tenter d'utiliser for...of sur un objet simple génère une TypeError. Cela se produit parce que les objets en JavaScript n'ont pas de méthode [Symbol.iterator], qui est requise pour la boucle for...of.
Pour parcourir des objets en JavaScript, plusieurs techniques sont disponibles :
La boucle for...in parcourt les propriétés énumérables d'un objet. Il parcourt les clés de l'objet.
const user = { name: 'John', age: 30 }; for (const key in user) { console.log(key, user[key]); } // Output: // name John // age 30
Object.keys() renvoie un tableau des propres clés de propriété de l'objet, vous permettant d'utiliser for...of pour les parcourir.
const user = { name: 'John', age: 30 }; for (const key of Object.keys(user)) { console.log(key, user[key]); } // Output: // name John // age 30
Object.values() renvoie un tableau des valeurs de propriété de l'objet, qui peut ensuite être itéré avec for...of.
const user = { name: 'John', age: 30 }; for (const value of Object.values(user)) { console.log(value); } // Output: // John // 30
Object.entries() renvoie un tableau des paires clé-valeur de l'objet, ce qui le rend parfait pour itérer sur les clés et les valeurs.
const user = { name: 'John', age: 30 }; for (const [key, value] of Object.entries(user)) { console.log(key, value); } // Output: // name John // age 30
Technique | Access to Keys | Access to Values | Inherited Properties | Simplicity |
---|---|---|---|---|
for...in | Yes | Yes | Yes (if enumerable) | Simple |
Object.keys() for...of | Yes | No | No | Moderate |
Object.values() for...of | No | Yes | No | Moderate |
Object.entries() for...of | Yes | Yes | No | Slightly complex |
The for...in loop is used to iterate over the enumerable properties (keys) of an object, including properties that may be inherited through the prototype chain.
const user = { name: 'John', age: 30 }; for (const key in user) { console.log(key, user[key]); } // Output: // name John // age 30
const colors = ['red', 'green', 'blue']; for (const index in colors) { console.log(index, colors[index]); } // Output: // 0 red // 1 green // 2 blue
The for...of loop is used to iterate over iterable objects like arrays, strings, maps, sets, and other iterables. It loops over the values of the iterable.
const colors = ['red', 'green', 'blue']; for (const color of colors) { console.log(color); } // Output: // red // green // blue
const name = 'John'; for (const char of name) { console.log(char); } // Output: // J // o // h // n
Feature | for...in | for...of |
---|---|---|
Purpose | Iterates over object keys (including inherited properties) | Iterates over iterable values (arrays, strings, etc.) |
Works with Objects | Yes | No (objects are not iterable) |
Works with Arrays | Yes, but not ideal (returns indices) | Yes, ideal (returns values) |
Use Case | Best for iterating over object properties | Best for arrays, strings, maps, sets, etc. |
Sometimes, objects are nested, and you need to iterate through all levels of the object. Here's an example that uses recursion to handle nested objects.
const user = { name: 'John', age: 30, address: { city: 'New York', zip: 10001 } }; // Recursively iterate through the object function iterate(obj) { for (const [key, value] of Object.entries(obj)) { if (typeof value === 'object' && !Array.isArray(value)) { console.log(`Entering nested object: ${key}`); iterate(value); // Recursively call for nested objects } else { console.log(key, value); // Output key-value pair } } } iterate(user); // Output: // name John // age 30 // Entering nested object: address // city New York // zip 10001
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!