Σύ

Σύνολα σε JavaScript

2 ασκήσεις

Σχετικά με την έννοια Σύνολα

Στη JavaScript, ένα set είναι μια δομή δεδομένων παρόμοια με λίστα που μπορεί να περιέχει μόνο μοναδικές πρωτογενείς τιμές ή/και αναφορές σε αντικείμενα.

Τα set πρέπει να δημιουργούνται χρησιμοποιώντας τον constructor του set. Μπορείς να τα αρχικοποιήσεις με τιμές περνώντας έναν πίνακα στον constructor.

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

Προσθήκη και αφαίρεση στοιχείων

Μια τιμή δεν μπορεί να προστεθεί σε ένα set αν είναι αυστηρά ίση με οποιοδήποτε από τα στοιχεία του set.

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

Μετατροπή μεταξύ set και πινάκων

Οι πίνακες μετατρέπονται σε set χρησιμοποιώντας τον constructor του set. Τα set μπορούν να μετατραπούν σε πίνακες χρησιμοποιώντας είτε τη σύνταξη spread είτε τη μέθοδο Array.from().

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]

Επανάληψη

Ένα set είναι μια συλλογή με κλειδιά, που σημαίνει ότι σε κάθε στοιχείο του αντιστοιχεί ένα κλειδί και μπορείς να τα διατρέξεις με τη σειρά εισαγωγής. Επειδή το κλειδί και η τιμή ενός στοιχείου ενός set είναι τα ίδια, τα Set.keys() και Set.values() είναι εναλλάξιμα.

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

Απόδοση αναζήτησης έναντι πινάκων

Όταν επιλέγεις ένα set για να αποθηκεύσεις μια συλλογή δεδομένων (αντί για έναν πίνακα), αυτό συμβαίνει συνήθως επειδή οι τιμές που αποθηκεύονται πρέπει να είναι μοναδικές. Ωστόσο, επειδή μπορείς να επιβάλεις τη μοναδικότητα και με πίνακες, μπορεί να μην είναι προφανές γιατί συμβαίνει αυτό.

Η σύντομη απάντηση είναι ότι τα set είναι βελτιστοποιημένα για αναζήτηση, ενώ οι πίνακες όχι. Οι μέθοδοι αναζήτησης των πινάκων (όπως η Array.indexOf()) έχουν χρόνους εκτέλεσης που αυξάνονται γραμμικά με το μέγεθος του πίνακα. Δηλαδή, όσο περισσότερα στοιχεία περιέχει ο πίνακας, τόσο περισσότερο χρόνο παίρνει η αναζήτηση σε αυτόν. Οι μέθοδοι αναζήτησης των set, από την άλλη, έχουν σταθερούς χρόνους εκτέλεσης, που σημαίνει ότι παραμένουν ίδιοι ανεξάρτητα από το μέγεθος του set.

Στην πράξη, όμως, αυτή η διαφορά στην απόδοση είναι αμελητέα, εκτός αν η συλλογή περιέχει τεράστιο όγκο δεδομένων.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Σύνολα