Em JavaScript, um set é uma estrutura semelhante a uma lista que contém valores únicos, que podem ser valores primitivos e/ou referências a objetos. Ao contrário de um array, não é possível aceder aos elementos de um set por índice.
Não é possível adicionar um valor a um set se ele for estritamente igual a algum 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
Podes passar um array como argumento ao criar um set, e os valores desse array passam a ser os valores do set, eliminando 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 num array, podes usar Array.from(), que converte um iterável, como um set ou um map, num 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]
O Ozan está a preparar uma lista de reprodução para uma viagem de carro que se aproxima. Não quer ouvir a mesma faixa mais do que uma vez, mas a lista de reprodução ficou tão longa que está a ter dificuldade em lembrar-se de que faixas já foram adicionadas.
A API do leitor de música do Ozan só sabe trabalhar com arrays, por isso ele tenta escrever algum código que usa Array.indexOf() para verificar a presença de uma faixa antes de a adicionar à lista de reprodução. Infelizmente, o programa dele demora demasiado tempo a executar. Ele precisa da tua ajuda!
Ao ires em auxílio do Ozan, ficas espantado por descobrir que a lista de reprodução dele contém meio milhão de faixas. Talvez conheças uma estrutura de dados diferente que te permita manipular a lista de reprodução de forma mais eficiente?
Implementa a função removeDuplicates, que recebe uma lista de reprodução como parâmetro e devolve uma nova lista de reprodução 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']
Implementa a função hasTrack, que recebe uma lista de reprodução e uma faixa como parâmetros e devolve um boolean que indica se a lista de reprodução 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
Implementa a função addTrack, que recebe uma lista de reprodução e uma faixa como parâmetros e devolve uma nova lista de reprodução 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']
Implementa a função deleteTrack, que recebe uma lista de reprodução e uma faixa como parâmetros e devolve uma nova lista de reprodução 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']
Implementa a função listArtists, que recebe uma lista de reprodução como parâmetro e devolve a lista dos artistas distintos na lista de reprodução. Repara que os nomes das faixas estão formatados como <SONG> - <ARTIST>.
const playlist = [
'All Mine - Portishead',
'Sight to Behold - Devendra Banhart',
'Sour Times - Portishead',
];
listArtists(playlist);
//=> ['Portishead', 'Devendra Banhart']
Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.