في JavaScript، المجموعة بنية بيانات شبيهة بالقائمة لا يمكنها أن تحتوي إلا على قيم أولية فريدة و/أو مراجع لكائنات.
يجب إنشاء المجموعات باستخدام دالة إنشاء المجموعة؛ ويمكن تهيئتها بقيم عبر تمرير مصفوفة إلى دالة الإنشاء.
const emptySet = new Set();
const setWithInitialValues = new Set(['hello', 'world']);
لا يمكن إضافة قيمة إلى مجموعة إذا كانت مساوية مساواة صارمة لأي من عناصر المجموعة.
const set = new Set();
set.add(10);
set.add(10); // 10 is strictly equal to 10, so it can't be added again
set.size;
//=> 1;
set.has(10);
//=> true
set.delete(10);
//=> true; 10 was removed
set.delete(10);
//=> false; 10 is not in the set, so nothing happened
const obj = { color: 'magenta' };
const eerilySimilarObj = { color: 'magenta' };
set.add(obj);
set.add(eerilySimilarObj); // obj and eerilySimilarObj reference different objects, so they can both be added
set.size;
//=> 2
set.clear();
set.size;
//=> 0
تُحوَّل المصفوفات إلى مجموعات باستخدام دالة إنشاء المجموعة. ويمكن تحويل المجموعات إلى مصفوفات باستخدام صيغة النشر أو Array.from().
const arrayWithDuplicates = [7, 3, 3, 9, 3];
const arrayWithoutDuplicates = [...new Set(arrayWithDuplicates)]; // [7, 3, 9]
const anotherArrayWithoutDuplicates = Array.from(new Set(arrayWithDuplicates)); // [7, 3, 9]
المجموعة هي مجموعة مفهرسة، وهذا يعني أن عناصرها مفهرسة بمفتاح ويمكن تكرارها بترتيب الإدراج. ولأن المفتاح والقيمة في عنصر المجموعة متماثلان، فإن Set.keys() وSet.values() يمكن استخدامهما بالتبادل.
const apples = ['Granny Smith', 'Honey Crisp', 'Royal Gala'];
const appleSet = new Set(apples);
for (let apple of appleSet.keys()) {
console.log(apple);
}
// 'Granny Smith'
// 'Honey Crisp'
// 'Royal Gala'
for (let apple of appleSet.values()) {
console.log(apple);
}
// 'Granny Smith'
// 'Honey Crisp'
// 'Royal Gala'
for (let apple of appleSet.entries()) {
console.log(apple);
}
// ['Granny Smith', 'Granny Smith']
// ['Honey Crisp', 'Honey Crisp']
// ['Royal Gala', 'Royal Gala']
عندما يُختار استخدام مجموعة لتخزين بيانات (بدلًا من مصفوفة)، فذلك عمومًا لأن القيم المخزَّنة يجب أن تكون فريدة. لكن بما أنه يمكن فرض التفرد في المصفوفات أيضًا، فقد لا يكون السبب واضحًا.
الجواب المختصر هو أن المجموعات مُحسَّنة للبحث، بخلاف المصفوفات. فطرق البحث في المصفوفات (مثل Array.indexOf()) لها زمن تنفيذ يزداد خطيًا مع حجم المصفوفة؛ أي أنه كلما زاد عدد العناصر في المصفوفة، استغرق البحث فيها وقتًا أطول. أما طرق البحث في المجموعات فلها زمن تنفيذ ثابت، أي أنه يبقى كما هو بغض النظر عن حجم المجموعة.
لكن من الناحية العملية، لا يُذكر هذا الفرق في الأداء إلا إذا كانت البيانات المخزَّنة ضخمة جدًا.