Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. Guide JavaScript
  4. Collections avec clés

Cette page a été traduite à partir de l'anglais par la communauté.Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in EnglishAlways switch to English

Collections avec clés

Ce chapitre présente les collections de données qui sont ordonnées avec une clé. Les objetsMap etSet contiennent des éléments sur lesquels on peut itérer dans leur ordre d'insertion.

Maps

Le typeMap

ECMAScript 2015 introduit une nouvelle structure de données pour faire correspondre des données entre elle. Un objetMap représente une collection de données qui sont des correspondances entre des clés ou valeurs et pour lequel on peut itérer dans l'ordre d'insertion pour lister les différentes clés / valeurs.

Le code suivant illustre certaines opérations basiques avecMap. Pour plus d'informations sur cet objet, voir également la page de référenceMap. Il est possible d'utiliser une bouclefor...of pour renvoyer un tableau[clé, valeur] à chaque itération.

js
var sayings = new Map();sayings.set("dog", "woof");sayings.set("cat", "meow");sayings.set("elephant", "toot");sayings.size; // 3sayings.get("fox"); // undefinedsayings.has("bird"); // falsesayings.delete("dog");for (var [key, value] of sayings) {  console.log(key + " goes " + value);}// "cat goes meow"// "elephant goes toot"

Comparaison entre les typesObject etMap

Habituellement, les objetsobjets ont été utilisés pour faire correspondre des chaînes avec des valeurs. Les objets permettent d'associer des clés avec des valeurs, de récupérer ces valeurs, de supprimer des clés, de détecter si quelque chose est enregistré dans une clé. Le typeMap possède cependant certains avantages pour être utilisés commemaps.

  • Les clés d'un objet de typeObject sont des chaînes de caractères. PourMap, une clé peut être une valeur de n'importe quel type.
  • On peut simplement obtenir la taille d'un objetMap alors qu'il faut tenir compte manuellement du nombre de clés contenue dans un objetObject.
  • Les itérations sur lesmaps se font dans l'ordre d'insertion des éléments.
  • Un objet de typeObject possède un prototype, il y a donc des clés par défaut déjà présentes dans l'objet. (cela peut être surchargé en utilisantmap = Object.create(null)).

Pour savoir si on doit utiliser le typeMap ou le typeObject, on peut considérer les aspects suivants :

  • On utilisera desmaps plutôt que des objets lorsque les clés sont inconnues avant l'exécution et lorsque toutes les clés sont de même type et que les valeurs sont de même type.
  • On utilisera desmaps lorsque les clés peuvent être des valeurs primitives autres que des chaînes de caractères (en effet, les objets considèrent toutes leurs clés comme des chaînes en convertissant les valeurs).
  • On utilisera des objets lorsqu'il y a une logique propre à des éléments individuels.

Le typeWeakMap

L'objetWeakMap est une collection de paires clés/valeurs pour lesquellesles clés sont uniquement des objets (les valeurs peuvent être d'un type arbitraire). Les références vers les objets sont des références « faibles ». Cela signifie qu'elles seront collectées par le ramasse-miettes s'il n'y a pas d'autres références vers cet objet. L'APIWeakMap offre les mêmes fonctionnalités que l'APIMap.

La différence entre le typeMap et le typeWeakMap est que les clés d'un objetWeakMap ne sont pas énumérables (c'est-à-dire qu'on n'a pas de méthode pour donner la liste des clés). S'il en existait une, la liste dépendrait de l'état d'avancement du ramasse-miettes, ce qui introduirait un non-déterminisme.

Pour plus d'informations et d'exemples, voir également le paragraphe « Pourquoi WeakMap ? » sur l'articleWeakMap de la référence.

Un cas d'utilisation des objetsWeakMap est le stockage de données privées d'un objet ou pour cacher certains détails d'implémentation. L'exemple qui suit est tiré du billet de blog de Nick Fitzgerald« Masquer des détails d'implémentation avec les WeakMaps ECMAScript 6 ». Les données et méthodes privées sont stockées dans l'objet WeakMapprivates. Tout ce qui est exposé par l'instance et le prototype est public. Tout ce qui est en dehors est inaccessible carprivates n'est pas exporté depuis le module :

js
const privates = new WeakMap();function Public() {  const me = {    // Les données privées ici  };  privates.set(this, me);}Public.prototype.method = function () {  const me = privates.get(this);  // On fait des choses avec les données privées dans `me`...};module.exports = Public;

Les ensembles

Le typeSet

Les objetsSet sont des ensembles de valeurs. Il est possible de les parcourir dans l'ordre d'insertion des éléments. Une valeur d'un élémentSet ne peut y apparaître qu'une seule fois, il est unique pour cette instance deSet.

Le code suivant illustre certaines opérations basiques avecSet. Voir aussi la pageSet pour plus d'exemples et l'API complète.

js
var monEnsemble = new Set();monEnsemble.add(1);monEnsemble.add("du texte");monEnsemble.add("toto");monEnsemble.has(1); // truemonEnsemble.delete("toto");monEnsemble.size; // 2for (let item of monEnsemble) console.log(item);// 1// "du texte"

Convertir des tableaux (Array) en ensembles (Set)

Il est possible de créer unArray à partir d'unSet grâce àArray.from ou l'opérateur de décomposition. Pour effectuer la conversion dans l'autre sens, on peut utiliser le constructeurSet avec un argument de typeArray. Encore une fois, les objetsSet stockent des valeurs uniques, les éléments dupliqués dans un tableau seront supprimés lors de la conversion.

js
Array.from(monSet);[...monSet2];monSet2 = new Set([1, 2, 3, 4]);

Comparaison entreArray etSet

Historiquement, on représentait des ensembles avec des tableaux JavaScript. Ce nouveau type,Set, possède certains avantages :

  • Lorsqu'on souhaite vérifier si un élément existe déjà dans un tableau, on est obligé d'utiliserindexOf ce qui peut diminuer les performances.
  • Les objetsSet permettent de supprimer les éléments avec leur valeur. Avec un tableau, il faudrait « découper » le tableau sur l'indice de l'élément.
  • Dans un tableau, la valeurNaN ne peut pas être trouvée avec la méthodeindexOf.
  • Les objetsSet permettent de stocker des valeurs uniques, il n'est pas nécessaire d'effectuer des vérifications manuellement.

Le typeWeakSet

Les objetsWeakSet sont des ensembles d'objets. Un objet d'unWeakSet ne peut y apparaître qu'une seule fois maximum. On ne peut pas itérer sur les objetsWeakSet (ils ne sont pas énumérables).

Les principales différences avec l'objetSet sont :

  • Contrairement aux objetsSet, les objetsWeakSet sont des ensembles qui ne comprennentque des objets, les valeurs ne peuvent pas être d'un type arbitraire.
  • Les objetsWeakSet utilisent des références faibles vers les objets. Ainsi, s'il n'y a pas d'autres références vers l'objet stocké dans leWeakSet, celui-ci pourra être collecté par le ramasse-miettes pour libérer de la mémoire. Cela signifie également qu'on ne peut pas maintenir une liste des différents objets contenus dans l'ensemble : les objetsWeakSet ne sont pas énumérables.

Les cas d'utilisations pour les objetsWeakSet objects sont relativement limités. Ils empêcheront toute fuite mémoire donc on pourra, de façon sécurisée, les utiliser avec des éléments DOM qui pourront être des clés (pour les utiliser par ailleurs, etc.).

Égalité des clés et des valeurs avecMap etSet

L'égalité utilisée pour les clés des objetsMap et celle utilisée pour les valeurs des objetsSet sont les mêmes : elles sont basées surl'algorithme suivant :

  • L'égalité fonctionne de la même façon qu'avec l'opérateur d'égalité stricte===.
  • -0 et+0 sont considérés égaux.
  • NaN est considéré égal à lui-même (contrairement à ce qu'on obtient avec===).

Help improve MDN

Learn how to contribute

Cette page a été modifiée le par lescontributeurs du MDN.


[8]ページ先頭

©2009-2025 Movatter.jp