Objavljeno

JavaScript setovi: Uvod za početnike programera

Autori

Zašto koristiti skup (Set)?

Skup je struktura podataka koja vam omogućava da pohranite jedinstvene vrijednosti bilo kojeg tipa. Sličan je nizu, ali ne dozvoljava duplicirane vrijednosti. Izvrstan je način za čuvanje jedinstvenih vrijednosti bilo koje vrste. Ponekad želite pohraniti jedinstvene vrijednosti u niz, ali ne želite prolaziti kroz cijeli niz kako biste provjerili postoji li već ta vrijednost. Tu je skup od velike koristi.

U prethodnom članku, raspravljali smo o Javascript mapi. Skup je sličan mapi, ali pohranjuje samo ključeve, a ne vrijednosti. To je odličan način da se održe jedinstvene vrijednosti bilo kojeg tipa. Previše je slučajeva kada je preopterećujuće koristiti mapu. Zato hajde da pričamo o skupovima.

Šta je JavaScript skup (Set)?

Objekti skupova su kolekcije vrijednosti. Vrijednost u skupu može se pojaviti samo jednom; ona je jedinstvena u kolekciji skupa. Možete proći kroz elemente skupa u redoslijedu umetanja. Redoslijed umetanja odgovara redoslijedu u kojem je svaki element umetnut u skup metodom add() (tj. nije bilo identičnog elementa već u skupu kada je skup pozvao add()).

Specifikacija zahtijeva da se skupovi implementiraju "tako da, u prosjeku, pružaju vrijeme pristupa koje je sublinearno na broju elemenata u kolekciji." Stoga bi se internu predstavljanju mogao koristiti hash stol (sa O(1) pretragom), pretraživačko stablo (sa O(log(N)) pretragom) ili bilo koja druga struktura podataka, sve dok je složenost bolja od O(N).

Kako kreirati skup?

Postoje dva načina za kreiranje skupa. Prvi način je korištenje konstruktora skupa. Drugi način je korištenje literala objekta skupa.

Konstruktor skupa

Konstruktor skupa kreira novi objekat skupa. Možete proći iterabilni objekt kao argument konstruktoru. Elementi iterabilnog objekta će biti dodani novom skupu.

const set = new Set([1, 2, 3, 4, 5])

Literal objekta skupa

Literal objekta skupa kreira novi objekat skupa. Možete proći iterabilni objekt kao argument literalu objekta. Elementi iterabilnog objekta će biti dodani novom skupu.

const set = {1, 2, 3, 4, 5};

Metode i svojstvo skupa

MetodaOpis
add()Dodaje novi element sa određenom vrijednošću u objekat skupa.
clear()Uklanja sve elemente iz objekta skupa.
delete()Uklanja element povezan s vrijednošću i vraća vrijednost koju bi Set.prototype.has(value) ranije vratio. Set.prototype.has(value) će nakon toga vratiti false.
entries()Vraća novi Iterator objekt koji sadrži niz od [value, value] za svaki element u objektu skupa, u redoslijedu umetanja.
forEach()Izvršava zadanu funkciju jednom za svaku vrijednost u objektu skupa, u redoslijedu umetanja.
has()Vraća boolean koji potvrđuje da li je element prisutan sa zadanom vrijednošću u objektu skupa.
keys()Vraća novi Iterator objekt koji sadrži vrijednosti za svaki element u objektu skupa u redoslijedu umetanja.
values()Vraća novi Iterator objekt koji sadrži vrijednosti za svaki element u objektu skupa u redoslijedu umetanja.
SvojstvoOpis
sizeVraća broj vrijednosti u objektu skupa.

Primjeri skupa

Dodavanje vrijednosti u skup

const set = new Set([1, 2, 3, 4, 5])
set.add(6)
console.log(Set) // Set { 1, 2, 3, 4, 5, 6 }

Brisanje vrijednosti iz skupa

const set = new Set([1, 2, 3, 4, 5])
set.delete(3)
console.log(set) // Set { 1, 2, 4, 5 }

Provjera da li vrijednost postoji u skupu

const set = new Set([1, 2, 3, 4, 5])
console.log(set.has(3)) // true

Iteriranje kroz skup

const set = new Set([1, 2, 3, 4, 5])
for (const item of Set) {
  console.log(item)
}
// 1
// 2
// 3
// 4
// 5

Konverzija skupa u niz

const set = new Set([1, 2, 3, 4, 5])
const array = Array.from(set)
console.log(array) // [1, 2, 3, 4, 5]

Konverzija niza u skup

const Array = [1, 2, 3, 4, 5]
const set = new Set(array)
console.log(Set) // Set { 1, 2, 3, 4, 5 }

Dobivanje veličine skupa

const set = new Set([1, 2, 3, 4, 5])
console.log(set.size) // 5

Brisanje skupa

const set = new Set([1, 2, 3, 4, 5])
set.clear()
console.log(set) // Set {}

Spajanje skupova

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([6, 7, 8, 9, 10])
const set3 = new Set([...set1, ...set2])
console.log(set3) // Set { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }

Dobivanje presjeka dva skupa

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([4, 5, 6, 7, 8])
const set3 = new Set([...set1].filter((x) => set2.has(x)))
console.log(set3) // Set { 4, 5 }

Dobivanje razlike između dva skupa

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([4, 5, 6, 7, 8])
const set3 = new Set([...set1].filter((x) => !set2.has(x)))
console.log(set3) // Set { 1, 2, 3 }

Provjera da li je jedan skup podskup drugog skupa

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([4, 5])
console.log([...set2].every((x) => set1.has(x))) // true

Provjera da li je jedan skup nadskup drugog skupa

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([4, 5])
console.log([...set1].every((x) => set2.has(x))) // false

Provjera da li su dva skupa disjunktna

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([6, 7, 8, 9, 10])
console.log([...set1].every((x) => !set2.has(x))) // true

Provjera da li su dva skupa jednaka

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([1, 2, 3, 4, 5])
console.log(set1.size === set2.size && [...set1].every((x) => set2.has(x))) // true

Podrška preglednika

ChromeChromeFirefoxFirefoxEdgeEdgeSafariSafariOperaOpera
49+44+12+10.1+36+

Skup nasuprot nizu

SkupNiz
Jedinstvena vrijednost, ne dozvoljava duplicirane vrijednostiDozvoljava duplicirane vrijednosti
Skup je kolekcija vrijednosti u nekom određenom redoslijeduNiz je kolekcija vrijednosti u određenom redoslijedu
Skup je iterabilniNiz je iterabilni
Skup je sporiji od niza u inicijalizaciji jer koristi hash proces.Niz je brži u smislu inicijalizacije
Performanse su bolje pri provjeri postojanja elementaPerformanse su bolje pri pristupanju elementu

Ovaj članak je originalno objavljen na blog.imam.dev.

Reference

  1. Mozilla Developer Network - Skup

  2. W3Schools - Skup

  3. ECMAScript® 2015 Language Specification - Skup