مسیرها
/
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]

دستورالعمل‌ها

اوزان دارد برای سفر جاده‌ای پیش‌رو یک پلی‌لیست آماده می‌کند. او نمی‌خواهد یک آهنگ را بیش از یک بار بشنود، اما پلی‌لیست آن‌قدر طولانی شده که دیگر به‌سختی یادش می‌آید کدام آهنگ‌ها را قبلاً اضافه کرده است.

API پخش‌کننده‌ی موسیقی اوزان فقط با آرایه‌ها کار می‌کند، بنابراین اوزان می‌کوشد کدی بنویسد که با کمک Array.indexOf() پیش از افزودن یک آهنگ به پلی‌لیست، وجود آن را بررسی کند. متأسفانه اجرای برنامه‌اش بیش از حد طول می‌کشد. او به کمک شما نیاز دارد!

وقتی به یاری اوزان می‌شتابید، شگفت‌زده می‌بینید که پلی‌لیست او نیم میلیون آهنگ دارد. شاید شما ساختار داده‌ی دیگری بشناسید که به کمک آن بتوانید پلی‌لیست را کارآمدتر مدیریت کنید؟

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 ثبت‌نام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.