Set

L'objet Set (Ensemble en français) permet de stocker des valeurs uniques, de n'importe quel type, que ce soit des valeurs d'un type primitif ou des objets.

Syntaxe

 new Set([itérable]);

Paramètres

itérable
Paramètre optionnel. Si un objet itérable est donné comme argument, l'ensemble de ses éléments sera ajouté au nouvel objet Set. null sera traité comme undefined.

Description

Les objets Set sont des ensembles de valeurs. Il est possible d'itérer sur les éléments contenus dans l'objet Set dans leur ordre d'insertion. Une valeur donnée ne peut apparaître qu'une seule fois par Set.

Égalité des valeurs

Chaque valeur d'un Set doit être unique, il faut donc tester l'égalité des valeurs contenues. Cette égalité n'est pas la même que celle de l'opérateur ===. Notamment, pour les objets Set+0 (qui, selon l'égalité stricte, est égal à -0) et -0 sont des valeurs différentes. Cela a toutefois été changé avec la dernière version d'ECMAScript 6. À partir de Gecko 29.0 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (bug 952870) et avec une version nightly récente de Chrome, +0 et -0 sont considérés comme les mêmes valeurs pour Set. NaN et undefined peuvent être enregistrés dans un objet Set. NaN est considéré comme NaN (bien que NaN !== NaN).

Propriétés

Set.length
La valeur de la propriété length est 0.
get Set[@@species]
Le constructeur utilisé pour créer des objets dérivés.
Set.prototype
Représente le prototype du constructeur Set. Cela permet d'ajouter des propriétés à tous les objets Set.

Instances de Set

Toutes les instances de Set héritent de Set.prototype.

Propriétés

Méthodes

Exemples

Utiliser l'objet Set

var monSet = new Set();

monSet.add(1);
monSet.add(5);
monSet.add("du texte");

monSet.has(1); // true
monSet.has(3); // false, 3 n'a pas été ajouté à l'ensemble
monSet.has(5);              // true
monSet.has(Math.sqrt(25));  // true
monSet.has("Du Texte".toLowerCase()); // true

monSet.size; // 3

monSet.delete(5); // retire 5 du set
monSet.has(5);    // false, 5 a été retiré de l'ensemble

monSet.size; // 2, on a retiré une valeur de l'ensemble

Itérer sur des ensembles (Set)

// On itère sur les différents éléments de l'ensemble
// ici on affiche : 1, "du texte" 
for (let item of monSet) console.log(item);

// ici on affiche les clés de l'ensemble : 1, "du texte"  
for (let item of monSet.keys()) console.log(item);
 
// ici on affiche les valeurs de l'ensemble : 1, "du texte" 
for (let item of monSet.values()) console.log(item);

// ici on affiche les clés de l'ensemble : 1, "du texte" 
//(ici, les clés et les valeurs sont les mêmes)
for (let [clé, valeur] of monSet.entries()) console.log(clé);

// Une méthode de conversion avec Array.from
var monTableau = Array.from(monSet);    // [1, "du texte"]

// Cela fonctionnera également dans un document HTML
monSet.add(document.body);
monSet.has(document.querySelector("body")); // true

// convertir un tableau (Array) en ensemble (Set) et vice versa
monSet2 = new Set([1,2,3,4]);
monSet2.size; // 4
[...monSet2]; // [1,2,3,4]

// L'intersection peut être calculée avec
var intersection = new Set([...set1].filter(x => set2.has(x)));

// La différence pourra être simulée avec 
var différence = new Set([...set1].filter(x => !set2.has(x)));

// On peut itérer sur les entrées d'un ensemble avec forEach
mySet.forEach(function(value) {
  console.log(value);
});

// 1
// 2
// 3
// 4

Implémenter des opérations ensemblistes

Set.prototype.isSuperset = function(subset) {
  for (var elem of subset) {
    if (!this.has(elem)) {
      return false;
    }
  }
  return true;
}

Set.prototype.union = function(setB) {
  var union = new Set(this);
  for (var elem of setB) {
    union.add(elem);
  }
  return union;
}

Set.prototype.intersection = function(setB) {
  var intersection = new Set();
  for (var elem of setB) {
    if (this.has(elem)) {
      intersection.add(elem);
    }
  }
  return intersection;
}

Set.prototype.difference = function(setB) {
  var difference = new Set(this);
  for (var elem of setB) {
    difference.delete(elem);
  }
  return difference;
}

// Exemples
var setA = new Set([1,2,3,4]),
    setB = new Set([2,3]),
    setC = new Set([3,4,5,6]);

setA.isSuperset(setB);   // => true
setA.union(setC);        // => Set [1, 2, 3, 4, 5, 6]
setA.intersection(setC); // => Set [3, 4]
setA.difference(setC);   // => Set [1, 2]

Les relations avec les objets Array

var monTableau = ["valeur1", "valeur2", "valeur3"];

// On peut utiliser le constructeur Set pour transformer un Array en Set
var monSet = new Set(monTableau);

monSet.has("valeur1"); // renvoie true

// Et utiliser l'opérateur de décomposition pour transformer un Set en Array.
console.log([...monSet]); // affichera la même chose que monTableau

Spécifications

Spécification État Commentaires
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'Set' dans cette spécification.
Standard Définition initiale.
ECMAScript 2017 Draft (ECMA-262)
La définition de 'Set' dans cette spécification.
Projet  

Compatibilité des navigateurs

Fonctionnalité Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Support simple

38 [1]

12 13 (13) 11 25 7.1
Argument du constructeur : new Set(iterable) 38 12 13 (13) Pas de support 25 9.0
Itérable 38 12 17 (17) Pas de support 25 7.1
Set.clear() 38 12 19 (19) 11 25 7.1
Set.keys(), Set.values(), Set.entries() 38 12 24 (24) Pas de support 25 7.1
Set.forEach() 38 12 25 (25) 11 25 7.1
Égalité des valeurs pour  -0 et 0 38 12 29 (29) Pas de support 25 9
Argument du constructeur : new Set(null) (Oui) 12 37 (37) 11 (Oui) 7.1
Constructeur corrigé (monkey-patched) avec add() (Oui) 12 37 (37) Pas de support (Oui) 9
Set[@@species] 51 13 41 (41) Pas de support 38 10
Set() lève une exception si new n'est pas utilisé (Oui) 12 42 (42) 11 (Oui) 9
Fonctionnalité Android Chrome pour Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Support simple Pas de support 38 [1] 13.0 (13) Pas de support Pas de support 8
Argument du constructeur : new Set(iterable) Pas de support 38 13.0 (13) Pas de support Pas de support 9
Itérable Pas de support Pas de support 17.0 (17) Pas de support Pas de support 8
Set.clear() Pas de support 38 19.0 (19) Pas de support Pas de support 8
Set.keys(), Set.values(), Set.entries() Pas de support 38 24.0 (24) Pas de support Pas de support 8
Set.forEach() Pas de support 38 25.0 (25) Pas de support Pas de support 8
Égalité des valeurs -0 et 0 Pas de support 38 29.0 (29) Pas de support Pas de support 9
Constructor argument: new Set(null) ? (Oui) 37.0 (37) ? ? 8
Constructeur corrigé (monkey-patched) avec add() ? (Oui) 37.0 (37) ? ? 9
Set[@@species] ? ? 41.0 (41) ? ? 10
Set() lève une exception si new est absent ? ? 42.0 (42) ? ? 9

[1] Cette fonctionnalité peut être activée grâce à une préférence. Dans chrome://flags, activer l'option « Activer la fonctionnalité expérimentale JavaScript ».

Voir aussi

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : SphinxKnight, vava
 Dernière mise à jour par : SphinxKnight,