轨道
/
JavaScript
JavaScript
/
练习
/
奥赞的播放列表
奥赞的播放列表

奥赞的播放列表

学习练习

简介

在 JavaScript 中,集合是一种类似列表的结构,其中包含唯一的值,这些值可以是原始值,也可以是对象引用,或者两者兼有。和数组不同,集合的元素不能通过下标访问。

如果一个值与集合中的任何元素都严格相等,那么这个值就不能被添加到集合中。

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

创建集合时,你可以把一个数组作为实参传入,数组中的值会成为集合的值,重复的值也会被去掉。

const array = [1, 5, 4, 1];
const set = new Set(array); // the set's values become [1, 5, 4]

console.log(set.size);
//=> 3

要把集合转换为数组,可以使用 Array.from(),它能把可迭代对象(比如集合或映射)转换为数组。

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 正在为即将到来的一次公路旅行准备播放列表。他不想把同一首曲目听两遍,但播放列表已经变得太长,他记不清哪些曲目已经加进去了。

Ozan 音乐播放器的 API 只会处理数组,于是他试着写了一些代码,用Array.indexOf()在把曲目加入播放列表之前检查它是否已经存在。可惜的是,他的程序运行起来太慢了。他需要你的帮助!

赶来帮助 Ozan 的你惊讶地发现,他的播放列表里居然有_五十万_首曲目。也许你知道另一种数据结构,能让你更高效地操作这个播放列表?

1. 移除重复的曲目

实现removeDuplicates函数:它接收一个播放列表作为_形参_,并_返回_一个新的播放列表,其中所有曲目都不重复。

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. 检查某首曲目是否已经添加过

实现hasTrack函数:它接收一个播放列表和一首曲目作为_形参_,并_返回_一个布尔值,表示该播放列表中是否包含这首曲目。

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. 添加一首曲目

实现addTrack函数:它接收一个播放列表和一首曲目作为_形参_,并_返回_一个包含该曲目的新播放列表。

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. 删除一首曲目

实现deleteTrack函数:它接收一个播放列表和一首曲目作为_形参_,并_返回_一个不包含该曲目的新播放列表。

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. 列出不重复的艺术家

实现listArtists函数:它接收一个播放列表作为_形参_,并_返回_播放列表中所有不重复的艺术家列表。注意,曲目的名称格式为<SONG> - <ARTIST>。

const playlist = [
  'All Mine - Portishead',
  'Sight to Behold - Devendra Banhart',
  'Sour Times - Portishead',
];

listArtists(playlist);
//=> ['Portishead', 'Devendra Banhart']
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
JavaScript Exercism

准备好开始 奥赞的播放列表 了吗?

注册 Exercism,借助 37 个概念159 个练习 和真人导师指导,学习并掌握 JavaScript,全部免费。