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é.
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).
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
| Besoin | Ce qu'il faut prendre |
|---|---|
| Accéder à la troisième valeur | Un tableau, un Set n'a pas d'index |
| Tester une appartenance souvent | Un Set, dont has ne parcourt rien |
| Garder les doublons | Un tableau, par construction |
| Trier, transformer, filtrer | Un 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.
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
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.
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.
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.