In JavaScript, un Set è una struttura simile a un array che contiene valori unici, i quali possono essere primitivi e/o riferimenti a oggetti. A differenza di un array, gli elementi di un Set non sono accessibili tramite indice.
Un valore non può essere aggiunto a un Set se è strettamente uguale a uno qualsiasi degli elementi del Set.
const set = new Set();
const object = { color: 'lime green' };
const functionallyIdenticalObject = { color: 'lime green' };
set.add(object);
set.add('wow');
set.add(77);
console.log(set.size);
//=> 3
set.add(functionallyIdenticalObject); // added because functionallyIdenticalObject is not strictly equal to object
console.log(set.size);
//=> 4
set.add(77); // not added because 77 is strictly equal to 77
console.log(set.size);
//=> 4
Quando crei un Set, puoi passare un array come argomento: i valori dell'array diventeranno i valori del Set, eliminando anche i duplicati.
const array = [1, 5, 4, 1];
const set = new Set(array); // the set's values become [1, 5, 4]
console.log(set.size);
//=> 3
Per convertire un Set in un array, puoi usare Array.from(), che converte un iterabile, come un Set o una Map, in un array.
const set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
const array = Array.from(set);
console.log(array);
//=> [1, 2, 3, 4]
Ozan sta mettendo insieme una playlist per un prossimo viaggio su strada. Non vuole sentire lo stesso brano più di una volta, ma la playlist è diventata così lunga che ha difficoltà a ricordare quali brani ha già aggiunto.
L'API del lettore musicale di Ozan sa lavorare solo con gli array, così lui prova a scrivere del codice che usa Array.indexOf() per verificare la presenza di un brano prima di aggiungerlo alla playlist. Purtroppo, il suo programma impiega troppo tempo per essere eseguito. Ha bisogno del tuo aiuto!
Accorrendo in aiuto di Ozan, scopri con stupore che la sua playlist contiene mezzo milione di brani. Forse conosci una struttura dati diversa che ti permetterà di gestire la playlist in modo più efficiente?
Implementa la funzione removeDuplicates, che prende una playlist come parametro e restituisce una nuova playlist in cui tutti i brani sono unici.
const playlist = [
'Court and Spark - Joni Mitchell',
'Big Yellow Taxi - Joni Mitchell',
'Court and Spark - Joni Mitchell',
];
removeDuplicates(playlist);
//=> ['Court and Spark - Joni Mitchell', 'Big Yellow Taxi - Joni Mitchell']
Implementa la funzione hasTrack, che prende una playlist e un brano come parametri e restituisce un valore booleano che indica se la playlist contiene il brano.
const playlist = [
'The Fashion Show - Grace Jones',
'Dr. Funkenstein - Parliament',
];
hasTrack(playlist, 'Dr. Funkenstein - Parliament');
//=> true
hasTrack(playlist, 'Walking in the Rain - Grace Jones');
//=> false
Implementa la funzione addTrack, che prende una playlist e un brano come parametri e restituisce una nuova playlist che include il brano.
const playlist = ['Selma - Bijelo Dugme'];
addTrack(playlist, 'Atomic Dog - George Clinton');
//=> ['Selma - Bijelo Dugme', 'Atomic Dog - George Clinton']
addTrack(playlist, 'Selma - Bijelo Dugme');
//=> ['Selma - Bijelo Dugme', 'Atomic Dog - George Clinton']
Implementa la funzione deleteTrack, che prende una playlist e un brano come parametri e restituisce una nuova playlist che non include il brano.
const playlist = [
'The Treasure - Fra Lippo Lippi',
'After the Fall - Klaus Nomi',
];
deleteTrack(playlist, 'The Treasure - Fra Lippo Lippi');
//=> ['After the Fall - Klaus Nomi']
deleteTrack(playlist, 'I Feel the Magic - Belinda Carlisle');
//=> ['After the Fall - Klaus Nomi']
Implementa la funzione listArtists, che prende una playlist come parametro e restituisce l'elenco degli artisti unici nella playlist. Nota che i nomi dei brani sono formattati come <SONG> - <ARTIST>.
const playlist = [
'All Mine - Portishead',
'Sight to Behold - Devendra Banhart',
'Sour Times - Portishead',
];
listArtists(playlist);
//=> ['Portishead', 'Devendra Banhart']
Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.