في 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 قائمة تشغيل لرحلة برية قادمة. لا يريد أن يسمع المقطوعة نفسها أكثر من مرة، لكنّ قائمة التشغيل صارت طويلة جدًا لدرجة أنه يجد صعوبة في تذكّر المقطوعات التي أُضيفت بالفعل.
إنّ API مشغّل الموسيقى لدى Ozan لا يعمل إلا مع المصفوفات، فيحاول كتابة كود يستخدم 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']
سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.