Objet.clés, valeurs, entrées

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}

Objet.keys/values/entries ignore les propriétés symboliques

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:

  1. Utiliser Object.entries(obj) pour obtenir un tableau de paires clé/valeur à partir de obj.
  2. Utiliser les méthodes de tableau sur ce tableau, par exemple map.
  3. 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.