[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Keyed_collections [Back]  [Original]

Collections avec cls - JavaScript | MDN

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 English Always switch to English

Collections avec cls

Ce chapitre prsente les collections de donnes qui sont ordonnes avec une cl. Les objets Map et Set contiennent des lments sur lesquels on peut itrer dans leur ordre d'insertion.

Dans cet article

Maps

Le type Map

ECMAScript 2015 introduit une nouvelle structure de donnes pour faire correspondre des donnes entre elle. Un objet Map reprsente une collection de donnes qui sont des correspondances entre des cls ou valeurs et pour lequel on peut itrer dans l'ordre d'insertion pour lister les diffrentes cls / valeurs.

Le code suivant illustre certaines oprations basiques avec Map. Pour plus d'informations sur cet objet, voir galement la page de rfrence Map. Il est possible d'utiliser une boucle for...of pour renvoyer un tableau [cl, valeur] chaque itration.

js
var sayings = new Map();
sayings.set("dog", "woof");
sayings.set("cat", "meow");
sayings.set("elephant", "toot");
sayings.size; // 3
sayings.get("fox"); // undefined
sayings.has("bird"); // false
sayings.delete("dog");

for (var [key, value] of sayings) {
  console.log(key + " goes " + value);
}
// "cat goes meow"
// "elephant goes toot"

Comparaison entre les types Object et Map

Habituellement, les objets objets ont t utiliss pour faire correspondre des chanes avec des valeurs. Les objets permettent d'associer des cls avec des valeurs, de rcuprer ces valeurs, de supprimer des cls, de dtecter si quelque chose est enregistr dans une cl. Le type Map possde cependant certains avantages pour tre utiliss comme maps.

  • Les cls d'un objet de type Object sont des chanes de caractres. Pour Map, une cl peut tre une valeur de n'importe quel type.
  • On peut simplement obtenir la taille d'un objet Map alors qu'il faut tenir compte manuellement du nombre de cls contenue dans un objet Object.
  • Les itrations sur les maps se font dans l'ordre d'insertion des lments.
  • Un objet de type Object possde un prototype, il y a donc des cls par dfaut dj prsentes dans l'objet. (cela peut tre surcharg en utilisant map = Object.create(null)).

Pour savoir si on doit utiliser le type Map ou le type Object, on peut considrer les aspects suivants :

  • On utilisera des maps plutt que des objets lorsque les cls sont inconnues avant l'excution et lorsque toutes les cls sont de mme type et que les valeurs sont de mme type.
  • On utilisera des maps lorsque les cls peuvent tre des valeurs primitives autres que des chanes de caractres (en effet, les objets considrent toutes leurs cls comme des chanes en convertissant les valeurs).
  • On utilisera des objets lorsqu'il y a une logique propre des lments individuels.

Le type WeakMap

L'objet WeakMap est une collection de paires cls/valeurs pour lesquelles les cls sont uniquement des objets (les valeurs peuvent tre d'un type arbitraire). Les rfrences vers les objets sont des rfrences faibles . Cela signifie qu'elles seront collectes par le ramasse-miettes s'il n'y a pas d'autres rfrences vers cet objet. L'API WeakMap offre les mmes fonctionnalits que l'API Map.

La diffrence entre le type Map et le type WeakMap est que les cls d'un objet WeakMap ne sont pas numrables (c'est--dire qu'on n'a pas de mthode pour donner la liste des cls). S'il en existait une, la liste dpendrait de l'tat d'avancement du ramasse-miettes, ce qui introduirait un non-dterminisme.

Pour plus d'informations et d'exemples, voir galement le paragraphe Pourquoi WeakMap ? sur l'article WeakMap de la rfrence.

Un cas d'utilisation des objets WeakMap est le stockage de donnes prives d'un objet ou pour cacher certains dtails d'implmentation. L'exemple qui suit est tir du billet de blog de Nick Fitzgerald Masquer des dtails d'implmentation avec les WeakMaps ECMAScript 6 . Les donnes et mthodes prives sont stockes dans l'objet WeakMap privates. Tout ce qui est expos par l'instance et le prototype est public. Tout ce qui est en dehors est inaccessible car privates n'est pas export depuis le module :

js
const privates = new WeakMap();

function Public() {
  const me = {
    // Les donnes prives ici
  };
  privates.set(this, me);
}

Public.prototype.method = function () {
  const me = privates.get(this);
  // On fait des choses avec les donnes prives dans `me`...
};

module.exports = Public;

Les ensembles

Le type Set

Les objets Set sont des ensembles de valeurs. Il est possible de les parcourir dans l'ordre d'insertion des lments. Une valeur d'un lment Set ne peut y apparatre qu'une seule fois, il est unique pour cette instance de Set.

Le code suivant illustre certaines oprations basiques avec Set. Voir aussi la page Set pour plus d'exemples et l'API complte.

js
var monEnsemble = new Set();
monEnsemble.add(1);
monEnsemble.add("du texte");
monEnsemble.add("toto");

monEnsemble.has(1); // true
monEnsemble.delete("toto");
monEnsemble.size; // 2

for (let item of monEnsemble) console.log(item);
// 1
// "du texte"

Convertir des tableaux (Array) en ensembles (Set)

Il est possible de crer un Array partir d'un Set grce Array.from ou l'oprateur de dcomposition. Pour effectuer la conversion dans l'autre sens, on peut utiliser le constructeur Set avec un argument de type Array. Encore une fois, les objets Set stockent des valeurs uniques, les lments dupliqus dans un tableau seront supprims lors de la conversion.

js
Array.from(monSet);
[...monSet2];

monSet2 = new Set([1, 2, 3, 4]);

Comparaison entre Array et Set

Historiquement, on reprsentait des ensembles avec des tableaux JavaScript. Ce nouveau type, Set, possde certains avantages :

  • Lorsqu'on souhaite vrifier si un lment existe dj dans un tableau, on est oblig d'utiliser indexOf ce qui peut diminuer les performances.
  • Les objets Set permettent de supprimer les lments avec leur valeur. Avec un tableau, il faudrait dcouper le tableau sur l'indice de l'lment.
  • Dans un tableau, la valeur NaN ne peut pas tre trouve avec la mthode indexOf.
  • Les objets Set permettent de stocker des valeurs uniques, il n'est pas ncessaire d'effectuer des vrifications manuellement.

Le type WeakSet

Les objets WeakSet sont des ensembles d'objets. Un objet d'un WeakSet ne peut y apparatre qu'une seule fois maximum. On ne peut pas itrer sur les objets WeakSet (ils ne sont pas numrables).

Les principales diffrences avec l'objet Set sont :

  • Contrairement aux objets Set, les objets WeakSet sont des ensembles qui ne comprennent que des objets, les valeurs ne peuvent pas tre d'un type arbitraire.
  • Les objets WeakSet utilisent des rfrences faibles vers les objets. Ainsi, s'il n'y a pas d'autres rfrences vers l'objet stock dans le WeakSet, celui-ci pourra tre collect par le ramasse-miettes pour librer de la mmoire. Cela signifie galement qu'on ne peut pas maintenir une liste des diffrents objets contenus dans l'ensemble : les objets WeakSet ne sont pas numrables.

Les cas d'utilisations pour les objets WeakSet objects sont relativement limits. Ils empcheront toute fuite mmoire donc on pourra, de faon scurise, les utiliser avec des lments DOM qui pourront tre des cls (pour les utiliser par ailleurs, etc.).

galit des cls et des valeurs avec Map et Set

L'galit utilise pour les cls des objets Map et celle utilise pour les valeurs des objets Set sont les mmes : elles sont bases sur l'algorithme suivant :

  • L'galit fonctionne de la mme faon qu'avec l'oprateur d'galit stricte ===.
  • -0 et +0 sont considrs gaux.
  • NaN est considr gal lui-mme (contrairement ce qu'on obtient avec ===).

Web Proxy Viewer  |  New URL  |  Original Page