درود دوستان! یکی از ویژگی‌های جالبی که از ES6 به جاوااسکریپت اضافه‌شده آبجکت Set هست که کاربرد اصلی اون، نگهداری مجموعه‌ای از مقادیر به صورت یکتا هست.

موارد زیر رو توی این قسمت یاد می‌گیریم:

 

آبجکت Set چیه؟

با آبجکت Set می‌تونیم مجموعه‌ای از مقادیر به صورت یکتا داشته باشیم. یعنی توی Set هیچ آیتم تکراری وجود نداره. نحوه ساختن یک آبجکت Set بصورت زیر هست:

new Set();

کافیه از کلمه‌کلیدی new استفاده کنیم. خب اینجا یک آبجکت خالی درست شد که در حال حاضر هیچ مقداری نداره. اگه هنگام ساختن این آبجکت، به اون یک مقدار قابل پیمایش (Iterable) پاس بدیم، مجموعه‌ی یکتایی از اعضا خواهیم داشت:

const numbers = [1, 2, 2, 2, 3];

const uniqueNumbers = new Set(numbers);

for (const num of uniqueNumbers) {
  alert(num); // 1, 2, 3
}

همونطور که می‌دونیم، آبجکت Set مقادیر یکتایی رو نگهداری می‌کنه. این مقادیر می‌تونن رشته، عدد، آبجکت، NaN و undefined باشن.

const items = new Set([undefined, undefined, undefined]);
alert(items.size); // 1

در حالیکه دو NaN هیچوقت با هم برابر نیستن (NaN !== NaN)، آبجکت Set فقط شامل یک مقدار NaN خواهد بود:

const items = new Set([NaN, NaN, NaN]);

alert(items.size); // 1

برای اطلاعات بیشتر درباره NaN می‌تونید پست زیر رو بخونید:

 

چند تا عضو داریم؟

اگه بخوایم تعداد اعضای آبجکت رو متوجه بشیم کافیه پراپرتی size رو فراخونی کنیم:

const uniqueNumbers = new Set([1, 2, 2, 2, 3]);

alert(uniqueNumbers.size); // 3

 

اضافه کردن به Set

اگه یک آبجکت Set از پیش تعریف‌شده داشته باشیم و بخوایم یک مقدار به اون اضافه کنیم، از متد add استفاده می‌کنیم:

const numbers = new Set();

numbers.add(1);
numbers.add(2);
numbers.add(2);
numbers.add(2);
numbers.add(3);

alert(numbers.size); // 3

همونطور که می‌بینیم، مقدارهای تکراری وارد این آبجکت نشدن.

خروجی متد add، همون آبجکت Set به همراه مقدار اضافه شده هست. پس می‌تونیم از اون به صورت زیر هم استفاده کنیم:

const numbers = new Set();

numbers.add(1).add(2).add(3);

alert(numbers.size); // 3

 

آیا Set چنین عضوی داره؟

برای اینکه بررسی کنیم یک آبجکت Set دارای یک مقدار خاص هست یا خیر، از متد has استفاده می‌کنیم:

const numbers = new Set();
numbers.add(1);

alert(numbers.has(1)); // true
alert(numbers.has(2)); // false

 

حذف کردن از Set

برای حذف کردن یک مقدار از ست از متد delete استفاده می‌کنیم:

const numbers = new Set([1]);

numbers.delete(1);

alert(numbers.has(1)); // false

و اگه بخوایم همه مقادیر رو پاک کنیم از متد clear استفاده می‌کنیم:

const numbers = new Set([1, 2]);

numbers.clear();

alert(numbers.size); // 0

 

 

آبجکت Set و حلقه for...of

همونطور که توی قسمت حلقه for...of گفتیم، این آبجکت یک مقدار قابل پیمایش هست. پس می‌تونه توی حلقه for...of قرار بگیره:

const numbers = new Set([1, 1, 2, 2, 3]);

for (const num of numbers) {
  alert(num); // 1, 2, 3
}

 

آبجکت Set و رشته‌ها

رشته‌ها توی جاوااسکریپت Iterable هستن و اگه به آبجکت Set یک رشته پاس بدیم، مقادیر تکراری حذف میشن:

const letter = new Set('banana');

alert([...letter].join('')); // ban

 

Set و آبجکت‌ها

همونطور که می‌دونیم، آبجکت‌هایی که ظاهر یکسان دارن، لزوماً با هم برابر نیستن. یعنی:

const x = { a: 1 };
const y = { a: 1 };

alert(x === y); // false

چون توی مقایسه، رفرنس آبجکت‌ها توی حافظه با هم مقایسه میشن. بنابراین یک آبجکت Set می‌تونه شامل دو آبجکت با ظاهری یکسان باشه:

const items = new Set([{ a: 1 }, { a: 1 }]);

alert(items.size); // 2

 با توجه به توضیحات بالا، آیا می‌تونید حدس بزنید که خروجی کد زیر چیه؟

const items = new Set([{ a: 1 }, { a: 1 }]);

alert(items.has({ a: 1 }));

برای مشاهده جواب دکمه نمایش رو بزنید:

خروجی کد خط ۳ برابر با false هست. چون به متد has داریم یک آبجکت با رفرنس مجزا پاس می‌دیم و چون توی آبجکت Set آبجکتی با چنین رفرنسی وجود نداره، خروجی false هست.

اما به صورت زیر می‌تونیم انتظار جواب true داشته باشیم:

const obj = { a: 1 }

const items = new Set([obj, { a: 1 }]);

alert(items.has(obj)); // true

برای اطلاعات بیشتر پیشنهاد می‌کنم پست زیر رو بخونید:

 

آبجکت Set شبیه به یک آرایه هست. اما همونطور که دیدیم برای اضافه کردن آیتم به آبجکت، نمی‌تونیم از متدهایی مثل .push() استفاده کنیم. همچنین از پراپرتی length برای گرفتن تعداد عضوها. با استفاده از روش زیر می‌تونیم یک آبجکت Set رو تبدیل کنیم به یک آرایه:

const numbers = new Set([1, 2, 2, 2, 3]);

const toArray = [...numbers]; // [1, 2, 3]

این یک روش رایج برای حذف کردن مقدارهای تکراری از آرایه هست. اینجا ابتدا از یک آرایهٔ موجود، یک آبجکت Set ساختیم تا مقادیری یکتا داشته باشیم. و سپس با عملگر Spread، آبجکت رو پخش کردیم توی یک آرایه جدید. اینطوری آرایه‌ای با مقادیر یکتا داریم.

 

خب دوستان امیدوارم از این پست استفاده کرده باشین. روزتون خوش 😉🌹