Les objets Set, Map, WeakSet, WeakMap en JavaScript sont des outils essentiels pour la manipulation de collections de données et la gestion de mappages dans vos applications. Comprendre comment utiliser Set, Map, WeakSet, WeakMap en JavaScript vous permettra d’améliorer l’efficacité et la performance de votre code. Apprenons leur fonctionnement à travers des exemples concrets.

Introduction aux Objets Set, Map, WeakSet, WeakMap en JavaScript

Set en JavaScript est une collection d’éléments uniques qui permet de stocker des valeurs primitives ou des objets. Voici comment créer et manipuler un Set :

Créer et Utiliser un Set

Pour créer un Set, vous pouvez utiliser le constructeur Set(), et ajouter des éléments avec la méthode add() :

// Créer un Set
const set = new Set();

// Ajouter des éléments
set.add(1);
set.add(2);
set.add(3);
set.add(1); // Duplicate value

console.log(set); // Output: Set(3) {1, 2, 3}

Manipuler les Valeurs dans un Set

Vous pouvez vérifier la présence d’un élément avec has(), supprimer un élément avec delete(), ou itérer sur les valeurs avec forEach() et for...of :

const set = new Set([1, 2, 3]);

console.log(set.has(2)); // Output: true

set.delete(2);

console.log(set.has(2)); // Output: false

// Itérer sur les valeurs
set.forEach(value => console.log(value));

for (const value of set) {
  console.log(value);
}

Créer et Utiliser un Map

Un Map en JavaScript est une collection de paires clé-valeur. Contrairement à un object, un Map peut avoir des clés de tout type.

// Créer un Map
const map = new Map();

// Ajouter des paires clé-valeur
map.set('name', 'John');
map.set('age', 30);

console.log(map); // Output: Map(2) {'name' => 'John', 'age' => 30}

// Accéder à une valeur
console.log(map.get('name')); // Output: John

// Vérifier la présence d'une clé
console.log(map.has('age')); // Output: true

// Supprimer une paire clé-valeur
map.delete('age');
console.log(map.has('age')); // Output: false

Itérer sur un Map

Il est possible d’itérer sur un Map en utilisant des boucles for...of, ou en récupérant les itérateurs des clés, valeurs, ou entrées :

const map = new Map([
  ['name', 'John'],
  ['age', 30]
]);

// Itérer sur les entrées
for (const [key, value] of map) {
  console.log(`${key}: ${value}`);
}

// Récupérer les clés
for (const key of map.keys()) {
  console.log(key);
}

// Récupérer les valeurs
for (const value of map.values()) {
  console.log(value);
}

Créer et Utiliser un WeakSet

Un WeakSet est similaire à un Set, mais il ne peut contenir que des objets, et non des valeurs primitives. Les objets stockés dans un WeakSet sont faiblement référencés, ce qui signifie qu’ils peuvent être collectés par le garbage collector s’il n’existe plus aucune référence à eux.

// Créer un WeakSet
const weakSet = new WeakSet();

const obj1 = {name: 'John'};
const obj2 = {age: 30};

// Ajouter des objets
weakSet.add(obj1);
weakSet.add(obj2);

console.log(weakSet.has(obj1)); // Output: true

// Supprimer un objet
weakSet.delete(obj1);
console.log(weakSet.has(obj1)); // Output: false

Créer et Utiliser un WeakMap

Un WeakMap est une collection de paires clé-valeur où les clés sont des objets et les valeurs peuvent être de tout type. Comme pour WeakSet, les clés dans un WeakMap sont faiblement référencées.

// Créer un WeakMap
const weakMap = new WeakMap();

const obj1 = {id: 1};
const obj2 = {id: 2};

// Ajouter des paires clé-valeur
weakMap.set(obj1, 'Alice');
weakMap.set(obj2, 'Bob');

console.log(weakMap.get(obj1)); // Output: Alice

// Vérifier la présence d'une clé
console.log(weakMap.has(obj2)); // Output: true

// Supprimer une paire clé-valeur
weakMap.delete(obj2);
console.log(weakMap.has(obj2)); // Output: false

Utilisations Avancées des Collections en JavaScript

Pour vous aider à maîtriser l’utilisation de Set, Map, WeakSet, et WeakMap, voyons quelques exemples détaillés tirés de projets réels.

Gestion des Abonnements avec Set

Imaginons une application de chat où vous souhaitez maintenir une liste unique d’abonnés pour chaque canal. Avec un Set, vous pouvez facilement gérer les abonnements :

class ChatChannel {
  constructor(name) {
    this.name = name;
    this.subscribers = new Set();
  }

  subscribe(user) {
    this.subscribers.add(user);
    console.log(`${user} a rejoint le canal ${this.name}`);
  }

  unsubscribe(user) {
    this.subscribers.delete(user);
    console.log(`${user} a quitté le canal ${this.name}`);
  }
}

const channel = new ChatChannel('Général');
channel.subscribe('Alice');
channel.subscribe('Bob');
channel.subscribe('Alice'); // Aucun doublon

console.log(channel.subscribers); // Output: Set(2) {'Alice', 'Bob'}

Utilisation de Map pour Gérer les Paramètres Utilisateur

Un Map peut être utilisé pour gérer les paramètres utilisateur dans une application. Contrairement à un objet, un Map permet d’utiliser des objets comme clés :

const userSettings = new Map();

const user1 = { id: 1, name: 'Alice' };
const user2 = { id: 2, name: 'Bob' };

// Ajouter des paramètres
userSettings.set(user1, { theme: 'dark', language: 'fr' });
userSettings.set(user2, { theme: 'light', language: 'en' });

console.log(userSettings.get(user1)); // Output: { theme: 'dark', language: 'fr' }

Utilisation de WeakSet pour Destructurer des Références à des Objets Complexes

Dans une application de suivi de ressources, un WeakSet peut être utilisé pour gérer des références à des objets complexes. Une fois que les objets ne sont plus nécessaires, ils peuvent être automatiquement nettoyés :

const resources = new WeakSet();

let resource1 = { description: 'Database Connection' };
let resource2 = { description: 'File Handle' };

resources.add(resource1);
resources.add(resource2);

console.log(resources.has(resource1)); // Output: true

resource1 = null;  // Cleanup, resource1 will be garbage collected

console.log(resources.has(resource1)); // Output: false

Utilisation de WeakMap pour Stocker des Données Privées

Un WeakMap est idéal pour stocker des données privées associées à des objets. Cela permet de protéger les données et de garantir qu’elles sont automatiquement collectées lorsque l’objet n’est plus accessible :

const privateData = new WeakMap();

class Person {
  constructor(name, age) {
    privateData.set(this, { name, age });
  }

  getName() {
    return privateData.get(this).name;
  }

  getAge() {
    return privateData.get(this).age;
  }
}

const person = new Person('Alice', 30);

console.log(person.getName()); // Output: Alice
console.log(person.getAge()); // Output: 30

Pour en savoir plus sur l’utilisation des collections en JavaScript, visitez le site de la documentation MDN. Vous pouvez également suivre des cours en ligne sur Coursera pour approfondir vos connaissances.

Categorized in:

Javascript,

Tagged in: