在 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 的你惊讶地发现,他的播放列表里居然有_五十万_首曲目。也许你知道另一种数据结构,能让你更高效地操作这个播放列表?
实现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']
实现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
实现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']
实现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']
实现listArtists函数:它接收一个播放列表作为_形参_,并_返回_播放列表中所有不重复的艺术家列表。注意,曲目的名称格式为<SONG> - <ARTIST>。
const playlist = [
'All Mine - Portishead',
'Sight to Behold - Devendra Banhart',
'Sour Times - Portishead',
];
listArtists(playlist);
//=> ['Portishead', 'Devendra Banhart']