نقشه ها (Maps)
یکی دیگر از انواع دادهها در جاوا اسکریپت، نوع دادهی نقشه یا Map است. یک نقشه متشکل از تعدادی داده است که در آن هر داده دارای یک نام (یا کلید) و یک مقدار است. این نوع داده در سایر زبانهای برنامهنویسی نیز وجود دارد و برای آن از اصطلاحاتی مانند دیکشنری (Dictionary) یا Hash Table نیز استفاده میشود. اما در جاوا اسکریپت این نوع داده را نقشه یا Map مینامیم.
برای ایجاد یک نقشهی جدید باید از تابع سازندهی Map و عملگر new استفاده کرد.
let myMap = new Map();
با استفاده از متد set میتوان یک عضو جدید را به یک نقشه اضافه کرد. این متد دو ورودی دریافت میکند. ورودی اول کلید عضو جدید است و ورودی دوم مقدار عضو جدید است.
myMap.set(1 , 'Apple');
← Map {1 => "Apple"}
در اینجا نیز مانند متد add در مجموعهها، میتوان متد set را به صورت زنجیرهای به کار برد و چندین عضو را در یک دستور به نقشه اضافه کرد.
myMap.set(1 , 'Apple').set(2 , 'Orange').set(3 , 'Banana');
← Map {1 => "Apple", 2 => "Orange", 3 => "Banana"}
توجه کنید که در نقشهها نمیتوان اعضایی با کلید تکراری ایجاد کرد. یعنی کلیدهایی که به کار برده میشوند باید منحصر به فرد باشند. اما اعضای نقشه میتوانند دارای مقادیر تکراری باشند. مثلاً در دستور اول زیر که در ادامهی دستورات فوق اجرا میشود، با توجه به تکراری بودن کلید 1، مقدار این عضو به روز رسانی میشود و عضو جدیدی ایجاد نمیشود. اما در دستور دوم، یک عضو جدید به نقشه اضافه میشود که مقدار تکراری دارد.
myMap.set(1 , 'Cherry');
← Map {1 => "Cherry", 2 => "Orange", 3 => "Banana"}
myMap.set(4 , "Orange");
← Map {1 => "Cherry", 2 => "Orange", 3 => "Banana" , 4 => "Orange"}
همچنین توجه کنید که کلیدهای یک نقشه لزوماً از نوع عددی و دارای ترتیب نیستند. یعنی هر نوع دادهای را با هر مقداری میتوان به عنوان کلید اعضای یک نقشه به کار برد. اما معمولاً کلیدها از نوع عددی یا رشتهای هستند. مقدار هر عضو نیز میتواند از هر نوع دادهای باشد. به قطعه کد زیر توجه کنید.
let myMap = new Map();
myMap.set(1 , 'Car').set('weight' , 1000).set('color' , 'Blue');
← Map {1 => "Car", "weight" => 1000, "color" => "Blue"}
همچنین در زمان تعریف یک نقشه میتوان با استفاده از یک آرایهی دو بُعدی، اعضای اولیهی آن را تعیین کرد. نحوهی انجام این کار را در قطعه کد زیر مشاهده میکنید. در این حالت هر عنصر از آرایهی دو بعدی، یک آرایه به طول ۲ است که در آن عنصر اول کلید، و عنصر دوم مقدار یک عضو از نقشه را مشخص میکند.
let person = new Map([ ['firstName' , 'Abbas'] , ['lastName' , 'Moqaddam'] , ['age' , 33] ]);
person;
← Map {"firstName" => "Abbas", "lastName" => "Moqaddam", "age" => 33}
متدها و خواص نقشهها
با استفاده از خاصیت size میتوان تعداد اعضای یک نقشه را به دست آورد.
let person = new Map();
person.set('firstName' , 'Abbas').set('lastName' , 'Moqaddam').set('age' , 33);
person.size;
← 3
با استفاده از متد get نیز میتوان مقدار یک عضو را به واسطهی کلید آن عضو به دست آورد.
let person = new Map();
person.set('firstName' , 'Abbas').set('lastName' , 'Moqaddam').set('age' , 33);
person.get('lastName');
← "Moqaddam"
در نقشهها نیز مانند مجموعهها، میتوان از متد delete برای حذف یک عضو از نقشه استفاده کرد. این متد در صورت وجود عضو مورد نظر، آن را حذف کرده و مقدار true را بازمیگرداند. و در صورت عدم وجود عضو مورد نظر، مقدار false را بازمیگرداند. همچنین از متد clear نیز میتوان برای حذف تمام اعضای یک نقشه استفاده کرد. به قطعه کد زیر توجه کنید.
let person = new Map();
person.set('firstName' , 'Abbas').set('lastName' , 'Moqaddam').set('age' , 33);
← Map {"firstName" => "Abbas", "lastName" => "Moqaddam", "age" => 33}
person.delete('age');
← true
person;
← Map {"firstName" => "Abbas", "lastName" => "Moqaddam"}
person.delete('weight');
← false
person.clear();
person;
← Map {}
تبدیل نقشهها به آرایه
در بخش قبل دیدیم که مجموعهها را میتوان به دو روش به آرایه تبدیل کرد. برای تبدیل نقشهها به آرایه نیز دقیقاً از همان دو روش میتوان استفاده کرد. یعنی استفاده از عملگر spread داخل علامت "[ ]"، و همچنین استفاده از متد Array.from و ارسال نقشهی مورد نظر به این متد. قطعه کد زیر نحوهی انجام این کار را به هر دو روش ذکر شده نشان میدهد.
let personMap = new Map();
personMap.set('firstName' , 'Abbas').set('lastName' , 'Moqaddam');
← Map {"firstName" => "Abbas", "lastName" => "Moqaddam"}
let personArray = [...personMap];
← [ ["firstName" , "Abbas"] , ["lastName" , "Moqaddam"] ]
personArray = Array.from(personMap);
← [ ["firstName" , "Abbas"] , ["lastName" , "Moqaddam"] ]
توجه کنید که نقشهها در زمان تبدیل شدن به آرایه، به آرایههای دو بُعدی تبدیل میشوند. زیرا هر عضو از نقشه دارای یک کلید و یک مقدار است که باید به یک آرایه با طول ۲ تبدیل شود.
همچنین توجه کنید که در جاوا اسکریپت نوع دیگری از نقشهها نیز وجود دارد. این نوع از نقشهها با عنوان نقشههای ضعیف (WeakMaps) شناخته میشوند. در فصل ۱۱ در مورد این نوع از نقشهها و خواص آنها بیشتر صحبت خواهیم کرد.