در 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
آرایهها با استفاده از سازندهی مجموعه به مجموعه تبدیل میشوند. مجموعهها را میتوان با نحوهی نگارش spread یا 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()) زمان اجرایی دارند که بهصورت خطی با اندازهی آرایه افزایش مییابد؛ یعنی هرچه آرایه عنصرهای بیشتری داشته باشد، جستوجو در آن بیشتر طول میکشد. در مقابل، متدهای جستوجوی مجموعه زمان اجرای ثابتی دارند، یعنی صرفنظر از اندازهی مجموعه یکسان میمانند.
اما در عمل، این تفاوت عملکرد ناچیز است، مگر اینکه مجموعه حجم بسیار زیادی داده داشته باشد.