بررسی شی Set در Javascript

شی Set یکی از اشیا از پیش ساخته شده و معرفی شده در جاوااسکریپت است که به دلیل ارائه طیف نسبتا مناسبی از متدها، بسیار کاربردی و مفید محسوب می شود. این شی به شما اجازه میدهد مجموعه ای از مقادیر غیر تکراری و منحصر به فرد را ذخیره کنید. از ورژن ES6 دارای ترتیب شد و به ترتیب مقادیر وارد شده در آن، قابل فراخوانی است.

تعریف شی Set: یک شی از پیش ساخته شده که به شما اجازه میدهد هر مقداری را با هر تایپی در آن ذخیره کنید.

۱ـ نحوه ایجاد شی Set:

let car = new Set();

با استفاده از دستور new، یک شی از نوع Set ساختیم به نام car.

برای تزریق داده به شی Set دو راه دارید:

الف) تزریق مستقیم:

let car = new Set(1);        // نتیجه:  1 

ب) استفاده از متد add:

car.add(1);         // نتیجه:  1 

به خاطر داشته باشید بلافاصله پس از نسبت دادن داده به شی، به آن دسترسی نخواهید داشت و باید آن را در حلقه بندازید.

انواع داده هایی که میتوانید به شی Set نسبت بدید برابر است با:

car.add( 1 );       //  عدد 
car.add( &quotxmrrabbitx&quot );       //  رشته متنی 
car.add( [1, 2, 3, 4, 5] );       //  آرایه 
car.add( { name:&quotxmrrabbitx&quot,  age:27 } );       //  شی جاوااسکریپتی
car.add( true );       //   true  false   یا همان   boolean مقدار 
car.add( null );       //   null مقدار   
car.add( undefined );       //   undefined  مقدار 

و همچنین داده های ۸ بیتی و سمبل ها را هم می شود نسبت داد اما از همه مهم تر می شود رفرنس یک شی دیگر را هم نسبت داد. به طور مثال:

const tesla = { type:&quotx19&quot, price:129000 };
car.add( tesla );            
// خروجی:  { type:&quotx19&quot, price:129000 }

خب همانطوری که دیدید رفرنس شی جاوااسکریپتی tesla را به شی Set دادیم تا به داده های قبل اضافه اش کند.

و اما می رویم به سراغ نمایش داده های ذخیره شده در آن. به راحتی از طریق حلقه for می توانید به آن ها دسترسی داشته باشید. به طور مثال:

for ( let item of car ) console.log( item );
// output: 1, &quotxmrrabbitx&quot, [1,2,3,4,5], {name:&quotxmrrabbitx&quot, age:27}, true, null,    
                           undefined,  {type:&quotx19&quot,price:129000}

خب همانطور دیدید خروجی حلقه ما حاوی تمام مقادیری بود که از ابتدای این مقاله به شی Set اضافه کردیم.

حالا تصور کنید من میخواهم یک مقدار خاص رو در این شی جست و جو کنم و از وجود داشتن آن اطمینان حاصل کنم. این شی، متد has را در اختیار ما قرار میدهد:

if ( car.has(&quotxmrrabbitx&quot) )   {        return true;     }
// output: true

همانطور که از کد بالا مشخص است ما شرطی را نوشتیم و با استفاده از متد از پیش آماده شده has ، وجود داشتن رشته متنی xmrrabbitx را در آن چک کردیم و پاسخ true بود.

بر همین منوال متد دیگری در اختیار داریم به نام delete جهت حذف کردن یک داده:

car.delete( [1,2,3,4,5] )         // آرایه مورد نظر حذف شد  

اما چه می شود اگر بخواهیم مقادیر دو شی Set را با هم مقایسه کنیم. فرض کنید دو شی Set داریم به شکل زیر:

const mySet1 = new Set( [1, 2, 3, 4] );
const mySet2 = new Set( [1, 2, 3, 4, 7, 8, 9] );

حالا می خواهیم ببینیم اعداد مشترک در این دو شی کدامند. برای قیاس این دو ابتدا باید هر دو شی را به آرایه تبدیل کنیم:

[...mySet2];

همانطور که دیدید از طریق کد ساده بالا، شی دوم را به آرایه تبدیل کردیم. ادامه می دهیم:

const vehicle = new Set([...mySet1].filter(x => mySet2.has(x)))
// output : [1,2,3,4]

سپس شی سوم از نوع Set ساختیم به نام vehicle در درون آن همان عملی را انجام دادیم که برای شی دوم انجام دادیم یعنی تبدیل شی اول به آرایه. سپس از متد filter استفاده کردیم تا بتوانیم دو شی را با هم قیاس بزنیم. در آخر از متد has استفاده کردیم تا ببینیم موارد شی دوم در درون شی اول هستند یا خیر. هر تعداد که بودند را متد filter جدا سازی میکند و سرانجام ما در قالب شی vehicle از آن خروجی میگیریم.

شی Set جایگزینی برای Array نیست:

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

امیدوارم این آموزش براتون مفید بوده باشه.

لینک داکیومنت شی Set جاوااسکریپت: Set Object