У 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]
Озан збирає плейлист для майбутньої подорожі. Він не хоче чути той самий трек більше ніж один раз, але плейлист став таким довгим, що йому вже важко згадати, які треки вже додані.
API музичного плеєра Озана вміє працювати лише з масивами, тож він намагається написати код, який використовує Array.indexOf(), щоб перевірити наявність треку перед тим як додати його до плейлиста. На жаль, його програма виконується надто довго. Йому потрібна наша допомога!
Прийшовши на допомогу Озанові, ми з подивом виявляємо, що його плейлист містить пів мільйона треків. Можливо, ми знаємо іншу структуру даних, яка дозволить ефективніше працювати з плейлистом?
Реалізуйте функцію 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, яка приймає плейлист і трек як параметри і повертає булеве значення (англ. Boolean), яке вказує, чи містить плейлист цей трек.
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']
Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.