در 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 را پیادهسازی کنید؛ این تابع یک پلیلیست و یک آهنگ را به عنوان پارامتر میگیرد و یک مقدار «منطقی» برمیگرداند که نشان میدهد آیا پلیلیست آن آهنگ را دارد یا نه.
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 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.