En

Ensembles en JavaScript

2 exercices

À propos de Ensembles

En JavaScript, un set est une structure de données qui ressemble à une liste et qui ne peut contenir que des valeurs uniques : des primitives et/ou des références vers des objets.

Les sets se créent à l'aide de leur constructeur ; on peut les initialiser avec des valeurs en lui passant un tableau.

const emptySet = new Set();
const setWithInitialValues = new Set(['hello', 'world']);

Ajouter et supprimer des éléments

Une valeur ne peut pas être ajoutée à un set si elle est strictement égale à l'un de ses éléments.

const set = new Set();
set.add(10);
set.add(10); // 10 is strictly equal to 10, so it can't be added again
set.size;
//=> 1;

set.has(10);
//=> true
set.delete(10);
//=> true; 10 was removed
set.delete(10);
//=> false; 10 is not in the set, so nothing happened

const obj = { color: 'magenta' };
const eerilySimilarObj = { color: 'magenta' };

set.add(obj);
set.add(eerilySimilarObj); // obj and eerilySimilarObj reference different objects, so they can both be added
set.size;
//=> 2

set.clear();
set.size;
//=> 0

Convertir des sets en tableaux, et inversement

On convertit un tableau en set à l'aide du constructeur. Et on peut convertir un set en tableau avec la syntaxe de déploiement ou avec Array.from().

const arrayWithDuplicates = [7, 3, 3, 9, 3];
const arrayWithoutDuplicates = [...new Set(arrayWithDuplicates)]; // [7, 3, 9]
const anotherArrayWithoutDuplicates = Array.from(new Set(arrayWithDuplicates)); // [7, 3, 9]

Itération

Un set est une collection indexée, ce qui signifie que ses éléments sont indexés par une clé et peuvent être parcourus dans l'ordre d'insertion. Comme la clé et la valeur d'un élément d'un set sont identiques, Set.keys() et Set.values() sont interchangeables.

const apples = ['Granny Smith', 'Honey Crisp', 'Royal Gala'];
const appleSet = new Set(apples);

for (let apple of appleSet.keys()) {
  console.log(apple);
}
// 'Granny Smith'
// 'Honey Crisp'
// 'Royal Gala'

for (let apple of appleSet.values()) {
  console.log(apple);
}
// 'Granny Smith'
// 'Honey Crisp'
// 'Royal Gala'

for (let apple of appleSet.entries()) {
  console.log(apple);
}
// ['Granny Smith', 'Granny Smith']
// ['Honey Crisp', 'Honey Crisp']
// ['Royal Gala', 'Royal Gala']

Performances de recherche par rapport aux tableaux

Quand on choisit un set pour stocker une collection de données (plutôt qu'un tableau), c'est généralement parce que les valeurs stockées doivent être uniques. Mais comme il est possible de garantir l'unicité avec des tableaux aussi, on ne voit pas forcément pourquoi opter pour un set.

La réponse courte, c'est que les sets sont optimisés pour la recherche, et pas les tableaux. Les méthodes de recherche des tableaux (comme Array.indexOf()) ont un temps d'exécution qui augmente linéairement avec la taille du tableau ; autrement dit, plus le tableau contient d'éléments, plus la recherche prend du temps. Les méthodes de recherche des sets, elles, ont un temps d'exécution constant, qui reste le même quelle que soit la taille du set.

En pratique, cependant, cette différence de performance est négligeable, sauf si la collection contient énormément de données.

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Ensembles