Laissons de côté les structures de données individuelles et parlons des itérations sur celles-ci.
Dans le chapitre précédent, nous avons vu les méthodes map.keys()
, map.values()
, map.entries()
.
Ces méthodes sont génériques, il y a un accord commun pour les utiliser pour les structures de données. Si jamais nous créons une structure de données de notre propre, nous devrions les implémenter aussi.
Elles sont supportées pour :
Map
Set
Array
Les objets simples supportent aussi des méthodes similaires, mais la syntaxe est un peu différente.
Objet.keys, values, entries
Pour les objets simples, les méthodes suivantes sont disponibles :
- Objet.keys(obj) – renvoie un tableau de clés.
- Objet.values(obj) – renvoie un tableau de valeurs.
- Object.entries(obj) – renvoie un tableau de paires
.
Veuillez noter les distinctions (par rapport à map par exemple) :
Map | Objet | |
---|---|---|
Syntaxe d’appel | map.keys() |
Object.keys(obj) , mais pas obj.keys() |
Returns | iterable | « real » Array |
La première différence est que nous devons appeler Object.keys(obj)
, et pas obj.keys()
.
Pourquoi ? La raison principale est la flexibilité. Rappelez-vous, les objets sont une base de toutes les structures complexes en JavaScript. Ainsi, nous pouvons avoir un objet à nous comme data
qui implémente sa propre méthode data.values()
. Et nous pouvons toujours appeler Object.values(data)
sur lui.
La deuxième différence est que les méthodes Object.*
renvoient de « vrais » objets de tableau, et pas seulement un itérable. C’est principalement pour des raisons historiques.
Par exemple :
let user = { name: "John", age: 30};
Object.keys(user) =
Object.values(user) =
Object.entries(user) = , ]
Voici un exemple d’utilisation de Object.values
pour boucler sur les valeurs des propriétés :
let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}
Tout comme une boucle for..in
, ces méthodes ignorent les propriétés qui utilisent Symbol(...)
comme clés.
En général, c’est pratique. Mais si nous voulons aussi des clés symboliques, alors il y a une méthode séparée Object.getOwnPropertySymbols qui renvoie un tableau de clés uniquement symboliques. De plus, il existe une méthode Reflect.ownKeys(obj) qui renvoie toutes les clés.
Transformation des objets
Les objets manquent de nombreuses méthodes qui existent pour les tableaux, par ex. map
, filter
et autres.
Si nous voulons les appliquer, alors nous pouvons utiliser Object.entries
suivi de Object.fromEntries
:
- Utiliser
Object.entries(obj)
pour obtenir un tableau de paires clé/valeur à partir deobj
. - Utiliser les méthodes de tableau sur ce tableau, par exemple
map
. - Utiliser
Object.fromEntries(array)
sur le tableau résultant pour le transformer à nouveau en objet.
Par exemple, nous avons un objet avec des prix, et nous voudrions les doubler :
let prices = { banana: 1, orange: 2, meat: 4,};let doublePrices = Object.fromEntries( // convert to array, map, and then fromEntries gives back the object Object.entries(prices).map(() => ));alert(doublePrices.meat); // 8
Cela peut sembler difficile à première vue, mais devient facile à comprendre après l’avoir utilisé une ou deux fois. Nous pouvons faire de puissantes chaînes de transformations de cette façon.