En JavaScript, un set es una estructura similar a un array que contiene valores únicos, los cuales pueden ser primitivos y/o referencias a objetos. A diferencia de un array, no se puede acceder a los elementos de un set por índice.
Un valor no se puede añadir a un set si es estrictamente igual a alguno de los elementos 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
Puedes proporcionar un array como argumento al crear un set, y los valores del array se convertirán en los valores del set, eliminando además los valores duplicados.
const array = [1, 5, 4, 1];
const set = new Set(array); // the set's values become [1, 5, 4]
console.log(set.size);
//=> 3
Para convertir un set en un array, puedes usar Array.from(), que convierte un iterable, como un set o un map, en 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 está preparando una lista de reproducción para un próximo viaje por carretera. No quiere escuchar la misma canción más de una vez, pero la lista de reproducción se ha vuelto tan larga que le cuesta recordar qué canciones ya se han añadido.
La API del reproductor de música de Ozan solo sabe trabajar con arrays, así que intenta escribir algo de código que use Array.indexOf() para comprobar si una canción está presente antes de añadirla a la lista de reproducción. Por desgracia, su programa tarda demasiado en ejecutarse. ¡Necesita tu ayuda!
Al acudir en ayuda de Ozan, te asombras al descubrir que su lista de reproducción contiene medio millón de canciones. ¿Quizá conoces otra estructura de datos que te permita manipular la lista de reproducción de forma más eficiente?
Implementa la función removeDuplicates, que toma una lista de reproducción como parámetro y devuelve una nueva lista de reproducción en la que todas las canciones son únicas.
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 función hasTrack, que toma una lista de reproducción y una canción como parámetros y devuelve un valor booleano que indica si la lista de reproducción contiene la canción.
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 función addTrack, que toma una lista de reproducción y una canción como parámetros y devuelve una nueva lista de reproducción que incluye la canción.
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 función deleteTrack, que toma una lista de reproducción y una canción como parámetros y devuelve una nueva lista de reproducción que no incluye la canción.
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 función listArtists, que toma una lista de reproducción como parámetro y devuelve la lista de artistas únicos de la lista de reproducción. Ten en cuenta que los nombres de las canciones tienen el formato <SONG> - <ARTIST>.
const playlist = [
'All Mine - Portishead',
'Sight to Behold - Devendra Banhart',
'Sour Times - Portishead',
];
listArtists(playlist);
//=> ['Portishead', 'Devendra Banhart']
Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.