Em JavaScript, um set é uma estrutura parecida com uma lista que contém valores únicos, que podem ser primitivos e/ou referências a objetos. Diferente de um array, os elementos de um set não podem ser acessados por índice.
Um valor não pode ser adicionado a um set se for estritamente igual a qualquer um dos elementos do 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
Você pode passar um array como argumento ao criar um set, e os valores do array se tornam os valores do set, removendo também os 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 converter um set em um array, você pode usar Array.from(), que converte um iterável, como um set ou um map, em um 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á montando uma playlist para uma viagem de carro que vai fazer em breve. Ele não quer ouvir a mesma faixa mais de uma vez, mas a playlist ficou tão longa que ele está com dificuldade para lembrar quais faixas já foram adicionadas.
A API do tocador de música do Ozan só sabe trabalhar com arrays, então ele tenta escrever um código que usa Array.indexOf() para verificar se uma faixa já está na playlist antes de adicioná-la. Infelizmente, o programa dele demora demais para executar. Ele precisa da sua ajuda!
Ao socorrer Ozan, você se espanta ao descobrir que a playlist dele tem meio milhão de faixas. Talvez você conheça uma estrutura de dados diferente que permita manipular a playlist com mais eficiência?
Implemente a função removeDuplicates, que recebe uma playlist como parâmetro e retorna uma nova playlist em que todas as faixas são ú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']
Implemente a função hasTrack, que recebe uma playlist e uma faixa como parâmetros e retorna um boolean que indica se a playlist contém a faixa.
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
Implemente a função addTrack, que recebe uma playlist e uma faixa como parâmetros e retorna uma nova playlist que inclui a faixa.
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']
Implemente a função deleteTrack, que recebe uma playlist e uma faixa como parâmetros e retorna uma nova playlist que não inclui a faixa.
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']
Implemente a função listArtists, que recebe uma playlist como parâmetro e retorna a lista de artistas únicos da playlist. Repare que os nomes das faixas seguem o formato <SONG> - <ARTIST>.
const playlist = [
'All Mine - Portishead',
'Sight to Behold - Devendra Banhart',
'Sour Times - Portishead',
];
listArtists(playlist);
//=> ['Portishead', 'Devendra Banhart']
Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.