Me

Mengen in JavaScript

2 Übungen

Über Mengen

In JavaScript ist ein Set eine listenähnliche Datenstruktur, die nur eindeutige primitive Werte und/oder Objektreferenzen enthalten kann.

Sets müssen mit dem Set-Konstruktor erstellt werden. Du kannst sie mit Werten initialisieren, indem du dem Konstruktor ein Array übergibst.

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

Elemente hinzufügen und entfernen

Ein Wert kann einem Set nicht hinzugefügt werden, wenn er strikt gleich einem der Elemente des Sets ist.

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

Sets und Arrays ineinander umwandeln

Arrays werden mit dem Set-Konstruktor in Sets umgewandelt. Sets lassen sich entweder mit der Spread-Syntax oder mit Array.from() in Arrays umwandeln.

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]

Iteration

Ein Set ist eine Sammlung mit Schlüsseln. Das bedeutet, dass seine Elemente über einen Schlüssel indexiert sind und in der Einfügereihenfolge durchlaufen werden können. Weil Schlüssel und Wert eines Set-Elements gleich sind, sind Set.keys() und Set.values() austauschbar.

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']

Suchleistung im Vergleich zu Arrays

Wenn du ein Set wählst, um eine Sammlung von Daten zu speichern (statt ein Array), dann meistens, weil die gespeicherten Werte eindeutig sein müssen. Da sich Eindeutigkeit aber auch mit Arrays erzwingen lässt, ist nicht unbedingt klar, warum das so ist.

Die kurze Antwort lautet: Sets sind auf die Suche optimiert, Arrays nicht. Die Laufzeit von Suchmethoden für Arrays (wie Array.indexOf()) wächst linear mit der Größe des Arrays. Das heißt: Je mehr Elemente das Array enthält, desto länger dauert die Suche. Suchmethoden von Sets haben dagegen eine konstante Laufzeit, sie bleiben also unabhängig von der Größe des Sets gleich.

In der Praxis ist dieser Unterschied in der Leistung jedoch vernachlässigbar, solange die Sammlung nicht eine riesige Datenmenge enthält.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Mengen