Percursos
/
JavaScript
JavaScript
/
Exercícios
/
A playlist do Ozan
A playlist do Ozan

A playlist do Ozan

Exercício de aprendizagem

Introdução

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]

Instruções

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?

1. Remover faixas duplicadas

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

2. Verificar se uma faixa já foi adicionada

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

3. Adicionar uma faixa

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

4. Eliminar uma faixa

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

5. Listar os artistas distintos

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']
Editar via GitHub A ligação abre numa nova janela ou separador
JavaScript Exercism

Estás pronto para começar A playlist do Ozan?

Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.