Set en JavaScript : une collection de valeurs sans doublons

Un Set ne garde qu'un exemplaire de chaque valeur : dédoublonner un tableau, tester une appartenance vite, et le piège des objets.
3 min de lecture
Believemy logo

Dédoublonner un tableau se fait en une ligne, à condition de connaître la bonne structure. Sans elle, on écrit une boucle imbriquée qui compare chaque élément à tous les autres, et le coût explose dès quelques milliers d'entrées.

Set règle ce cas et un autre, tout aussi fréquent : savoir vite si une valeur a déjà été vue.


Définition

Un Set est une collection de valeurs où chaque valeur n'apparaît qu'une fois. Ajouter une valeur déjà présente ne fait rien, et l'ordre d'insertion est conservé.

JAVASCRIPT
const vus = new Set();

vus.add("ada@site.fr");
vus.add("ada@site.fr");
vus.add("alan@site.fr");

console.log(vus.size);              // 2
console.log(vus.has("ada@site.fr")); // true
vus.delete("alan@site.fr");
console.log([...vus]);              // [ 'ada@site.fr' ]

Quatre méthodes suffisent : add, has, delete et clear. La taille se lit dans size, jamais dans une propriété length.


Dédoublonner un tableau

C'est l'usage le plus courant, et il tient sur une ligne grâce à Spread (...), qui redéplie le Set en Array (tableau).

JAVASCRIPT
const langues = ["fr", "en", "fr", "es", "en"];
const uniques = [...new Set(langues)];

console.log(uniques);   // [ 'fr', 'en', 'es' ]

Le constructeur accepte tout ce qui se parcourt, une chaîne comprise : new Set("hello") contient quatre lettres, le second l ayant été écarté.


Set ou tableau

BesoinCe qu'il faut prendre
Accéder à la troisième valeurUn tableau, un Set n'a pas d'index
Tester une appartenance souventUn Set, dont has ne parcourt rien
Garder les doublonsUn tableau, par construction
Trier, transformer, filtrerUn tableau, quitte à repasser par un Set

La conversion dans les deux sens est bon marché, ce qui rend le va-et-vient courant : on passe par un Set pour retirer les doublons, puis on revient au tableau pour trier ou afficher le résultat.

Attention

L'unicité porte sur la valeur, et deux objets distincts sont deux valeurs différentes même s'ils se ressemblent. new Set([{ x: 1 }, { x: 1 }]).size vaut 2. Pour dédoublonner des objets, il faut d'abord en tirer une clé, un identifiant par exemple.


Questions fréquentes

Question

Un Set est-il vraiment plus rapide qu'un tableau ?

Pour tester une appartenance, oui, et l'écart grandit avec la taille : has ne dépend pas du nombre d'éléments, là où includes parcourt le tableau. Sur dix valeurs la différence ne se mesure pas, sur cinquante mille elle décide.

Question

Comment faire l'intersection de deux collections ?

La méthode portable consiste à filtrer un tableau sur le has de l'autre collection. Les moteurs récents ajoutent union, intersection et difference directement sur Set, à réserver aux environnements dont vous maîtrisez la version.

Question

Peut-on convertir un Set en JSON ?

Pas directement : comme pour les Map, JSON produit un objet vide. Il faut le déplier en tableau avant, avec JSON.stringify([...monSet]), et reconstruire un Set à la lecture.

Termes connexes

Découvrez notre glossaire JavaScript

Tous les mots de JavaScript expliqués simplement : mots-clés, objets natifs, méthodes, erreurs et concepts. Définitions claires et exemples qui tournent, pour apprendre et pour se dépanner.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.