Map در جاوا اسکریپت


تا قبل از ES6، هر زمان که شما نیاز به نگاشت key به value داشتید،باید از objet استفاده می کردید، زیر object به شما این اجازه رو می داد تا یک سری key رو به یک سری value با هر type، نگاشت کنید.
با این حال، استفاده از object برای map باعث ایجاد side effects می شد:
- هر object همیشه یک key پیشفرض مانند prototype دارد.
- key های یک object باید string یا symbol باشند و شما نمی توانید از هر type برای key ها استفاده کنید.
ES6 یک collection type جدید به نام Map فراهم می کند که این نقایص را برطرف می کند.
بر طبق تعریف ، یک Map
objectدارای جفت key-value است که در آن از هر نوع type می توان به عنوان key یا value استفاده کرد. علاوه بر این ، یک Map
object ترتیب درج اصلی key ها را به خاطر می آورد.
برای ایجاد یک Map جدید،باید از syntax زیر استفاده کنید:
1 |
let map = new Map([iterable]); |
method های مفید ()Map
- ()clear: تمامی element ها را از map object حذف می کند.
- delete(key) : یک element خاص را از طریق key حذف می کند.
- ()entries : یک Iterator object جدید شامل یک آرایه از [key, value] برای هر کدام از element های map برمی گرداند.
- get(key) : مقدار(value) مربوط به key را برمی گرداند. اگر key وجود نداشته باشد ، undefined برمی گردد.
- has(key) : در صورتی که value مرتبط با key وجود داشته باشد، true را برمی گرداند ، در غیر این صورت ، false را برمی گرداند.
- ()keys : یک Iterator جدید که شامل keyهای element ها به ترتیب درج است،بر می گرداند.
- ()values : یک Iterator جدید که شامل value های element ها به ترتیب درج است،بر می گرداند.
مثال هایی از Map در جاوا اسکریپت
فرض کنید لیستی از user objects به شرح زیر دارید:
1 2 3 |
let john = {name: 'John Doe'}, lily = {name: 'Lily Bush'}, peter = {name: 'Peter Drucker'}; |
فرض کنیدکه میخواهید یک map از کاربران و نقش آنها ایجاد کنید. برای این کار باید از کد زیر استفاده می کنید:
1 |
let userRoles = new Map(); |
userRoles
یک نمونه از Map
است و type آن همانطور که در مثال زیر مشاهده می کنید،object است:
1 2 |
console.log(typeof(userRoles)); // object console.log(userRoles instanceof Map); // true |
برای تخصیص نقش به یک کاربر،باید از ()set استفاده کنید:
1 |
userRoles.set(john, 'admin'); |
از آنجا که متد ()set به صورت زنجیره ای قابل استفاده است ، می توانید element ها را همانطور که در این مثال نشان داده شده ذخیره کنید:
1 2 |
userRoles.set(lily, 'editor') .set(peter, 'subscriber'); |
همانطور که قبلا اشاره شد،شما می توانید یک iterable object را به Map()
constructor پاس دهید:
1 2 3 4 5 |
let userRoles = new Map([ [john, 'admin'], [lily, 'editor'], [peter, 'subscriber'] ]); |
اگز شما بخواهید نقش John
را ببنید،باید از متد ()get استفاده کنید:
1 |
userRoles.get(john); // admin |
اگر شما یک key را که در map وجود ندارد به متد ()get پاس دهید،undefined را برمی گرداند:
1 2 |
let foo = {name: 'Foo'}; userRoles.get(foo); //undefined |
برای چک کردن اینکه آیا یک key در map وجود دارد،باید از متد ()has استفاده کنید:
1 2 |
userRoles.has(foo); // false userRoles.has(lily); // true |
property size تعداد element های map را برمی گرداند.
1 |
console.log(userRoles.size); // 3 |
Iterate over map keys
برای گرفتن keyهای Map
object، شما باید از متد ()keys استفاده کتید.()keys یک iterator object جدید که شامل key های element های درون map است،بر می گرداند.
مثال زیر username هر کدام از کاربران درون userRoles را نشان می دهد.
1 2 3 4 5 6 |
for (let user of userRoles.keys()) { console.log(user.name); } // John Doe // Lily Bush // Peter Drucker |
به طور مشابه،متد ()values یک iterator object جدید که شامل value های element های درون map است،بر می گرداند.
1 2 3 4 5 6 |
for (let role of userRoles.values()) { console.log(role); } // admin // editor // subscriber |
همچنین متد ()entriesیک iterator object که شامل یک آرایه از [key,value] هر کدام از element های Map
object است،بر می گرداند:
1 2 3 4 5 6 7 |
for (let elem of userRoles.entries()) { console.log(`${elem[].name}: ${elem[1]}`); } // John Doe: admin // Lily Bush: editor // Peter Drucker: subscriber |
برای طبیعی تر شدن iteration ، می توانید از destructuring مشابه زیر استفاده کنید:
1 2 3 |
for (let [user,role] of userRoles.entries()) { console.log(`${user.name}: ${role}`); } |
علاوه بر حلقه for …of ، می توانید از متد ()forEach برای map استفاده کنید:
1 2 3 |
userRoles.forEach((role, user) => console.log(`${user.name}: ${role}`) ); |
گاهی اوقات شما می خواهید با یک آرایه به جای iterable object کار کنید،در این موارد می توانید از spread operator استفاده کنید.برای مثال :
مثال زیر key های هر element را به آرایه ای از key ها تبدیل می کند:
1 2 |
var keys = [...userRoles.keys()]; console.log(keys); |
خروجی:
1 2 3 |
[ { name: 'John Doe' }, { name: 'Lily Bush' }, { name: 'Peter Drucker' } ] |
و مثال زیر value های element ها را یک آرایه تبدیل می کند:
1 2 |
var roles = [...userRoles.values()]; console.log(roles); |
خروجی:
1 |
[ 'admin', 'editor', 'subscriber' ] |
برای حذف یک element در map، از متد ()delete باید استفاده کنید.
1 |
userRoles.delete(john); |
برای حذف تمامی element های درون map باید از متد ()clear استفاده کنید
1 |
userRoles.clear(); |
از این رو ، سایز map در حال حاضر صفر است.
1 |
console.log(userRoles.size); // 0 |
دیدگاهتان را بنویسید