اکما اسکرپیت 6 دو ساختار داده ای جدید را معرفی کرده است: Map و Set.
آبجکت Map در حقیقت یک جفت کلید/مقدار است. این کلید/مقدار می تواند از نوع های اولیه یا آبجکت باشد.
سینتکس آن مطابق زیر است
new Map([iterable])
پارامتر iterable هر آبجکت iterableیی که عناصرش یک کلید و مقدار دارد را نمایش می دهد. Mapها مرتب شده هستند، یعنی به همان ترتیبی که عناصرش داخل آن قرار گرفته باشد، پیمایش می شوند.
# | پروپرتی | توضیحات |
1 | Map.prototype.size | این متد تعداد جفت کلید-مقدار موجود در یک آبجکت را بر میگرداند |
تابع set() یک مقدار را به کلید آبجکت Map اضافه میکند. تابع set() دو پارامتر می گیرد، کلید و مقدار آن. این تابع یک آبجکت Map را بر می گرداند. تابع has() یک کلید را در یک آبجکت Map جستجو می کند و در صورت پیدا شدن کلید مقدار true را بر می گرداند و در غیر اینصورت false را بر می گرداند.
این تابع یک کلید را به عنوان پارامتر می گیرد.
var map = new Map(); map.set('name','Tutorial Point'); map.get('name'); // Tutorial point
مثال بالا یک آبجکت Map را ایجاد می کند. Map فقط یک عنصر دارد. کلید این عنصر با name مشخص شده است. این کلید یک مقدار به نام Tutorial point نسبت داده شده است.
نکته: این Mapها بین مقادیر مشابه متمایز هستند، اما نوع داده های آنها با هم تفاوت دارد. به عبارت دیگر، یک کلید عددی به نام 1 متفاوت از کلید رشته ای به نام "1" است. به مثال زیر توجه کنید تا بهتر این مفهوم را درک کنید.
var map = new Map(); map.set(1,true); console.log(map.has("1")); //false map.set("1",true); console.log(map.has("1")); //true
خروجی
false true
از متد set() می توانید به صورت زنجیره ای استفاده کنید.
var roles = new Map(); roles.set('r1', 'User') .set('r2', 'Guest') .set('r3', 'Admin'); console.log(roles.has('r1'))
خروجی
True
در مثال بالا یک آبجکت map تعریف و سپس تابع set() را برای تعریف این جفت کلید-مقدار به آن زنجیر کردیم.
از تابع get() برای مقدار مربوط به یک کلید استفاده می کنیم.
متد Map به عنوان پارامتر می تواند یک آرایه هم دریافت کند. همچنین از عملگر spread می توانید برای نمایش یک آرایه استفاده کنید.
مثال
var roles = new Map([ ['r1', 'User'], ['r2', 'Guest'], ['r3', 'Admin'], ]); console.log(roles.get('r2'))
خروجی
Guest
تابع get() در صورتی که مقدار یک کلید را در map پیدا نکند، مقدار undefined را بر میگرداند. تابع set() یک مقدار را برای کلید مشخص شده اضافه می کند.
var roles = new Map([ ['r1', 'User'], ['r2', 'Guest'], ['r3', 'Admin'], ]); console.log(`value of key r1 before set(): ${roles.get('r1')}`) roles.set('r1','superUser') console.log(`value of key r1 after set(): ${roles.get('r1')}`)
خروجی
value of key r1 before set(): User value of key r1 after set(): superUser
# | متد | توضیحات |
1 | Map.prototype.clear() | تمام جفت های کلید-مقدار را از آبجکت Map حذف می کند. |
2 | Map.prototype.delete(key) | تمام مقادیر کلید مشخص شده را حذف کرده و مقداری که تابع Map.prototype.has(key) قبلاً بر گردانده بود، را به ما بر می گرداند |
3 | Map.prototype.entries() | یک آبجکت Iterator جدید را که شامل یک آرایه ای از کلید-مقدار برای هر عنصر آبجکت Map است، بر می گرداند |
4 | Map.prototype.forEach(callbackFn[, thisArg]) | callbackFn را برای هر جفت کلید-مقدار آبجکت Map یکبار فراخوانی می کند. |
5 | Map.prototype.keys() | یک آبجکت iterator جدید که شامل کلیدهای آبجکت Map است را بر می گرداند |
6 | Map.prototype.values() | یک آبجکت iterator جدید که شامل یک آرایه از کلید-مقدار آبجکت Map است را بر می گرداند. |
حلقه for…of
در مثال زیر نحوه پیمایش یک Map توسط حلقه for…of را نشان داده ایم
'use strict' var roles = new Map([ ['r1', 'User'], ['r2', 'Guest'], ['r3', 'Admin'], ]); for(let r of roles.entries()) console.log(`${r[0]}: ${r[1]}`);
خروجی
r1: User r2: Guest r3: Admin
Weak mapها مشابه map معمولی هستند، با این تفاوت که:
مثال- weak map
'use strict' let weakMap = new WeakMap(); let obj = {}; console.log(weakMap.set(obj,"hello")); console.log(weakMap.has(obj));// true
خروجی
WeakMap {} true
یک set یک ساختار داده در اکما اسکریپت 6 است. یک set مشابه یک آرایه است با این تفاوت که نمی تواند شامل مقادیر تکراری باشد. به عبارت دیگر فقط مقادیر منحصر به فرد باید در آن ذخیره کنید. set ها از مقادیر اولیه و آبجکت ها پشتیبانی می کنند.
مشابه map ،setها هم مرتب شده هستند. یعنی عناصر به همان ترتیبی که در آن درج شده اند، پیمایش می شود.
# | پروپرتی | توضیحات |
1 | Set.prototype.size | تعداد مقادیر یک آبجکت set را بر می گرداند |
# | متد | توضیحات |
1 | Set.prototype.add(value) | یک عنصر مقداردهی شده را به یک آبجکت set اضافه می کند و آبجکت set را بر می گرداند |
2 | Set.prototype.clear() | تمام عناصر را از آبجکت set حذف می کند. |
3 | Set.prototype.delete(value) | تمام عناصر که مقدار value دارند را حذف می کند |
4 | Set.prototype.entries() | یک آبجکت Iterator که شامل آرایه ای از کلید-مقدار برای هر عنصر در آبجکت set است را بر می گرداند. این متد همانند آبجکت map است، چون هر ورودی مقدار یکسان برای کلید و مقادیرش دارد. |
5 | Set.prototype.forEach(callbackFn[, thisArg]) | callbackFn را برای هر مقدار آبجکت Set فراخوانی می کند. در صورتی که forEach پارامتر thisArg را دریافت کند، از مقدار this برای هر کالبک استفاده میکند. |
6 | Set.prototype.has(value) | یک مقدار بولین را بر می گرداند و مشخص می کند که آیا یک عنصر مقدار مشخص شده value را در آبجکت set دارد یا نه؟ |
7 | Set.prototype.values() | یک آبجکت Iterator جدید که شامل مقادیر value های هر عنصر در آبجکت set است را بر می گرداند. |
Weak set یا set ضعیف
Weak setها فقط می تواند شامل آبجکت باشد، و آبجکت ها ممکن است شامل جمع آوری حافظه باشند. مشابه weak mapها، weak setها نمی توانند پیمایش شوند.
مثال- استفاده از weak set
'use strict' let weakSet = new WeakSet(); let obj = {msg:"hello"}; weakSet.add(obj); console.log(weakSet.has(obj)); weakSet.delete(obj); console.log(weakSet.has(obj));
خروجی
true false
Iterator یک آبجکت است که اجازه می دهد به مجموعه ای از آبجکت ها بصورت یکجا دسترسی داشته باشید. Set و map متدهایی دارند که یک Iterator را بر می گرداند. آبجکت های یک Iterator متد next() را همراه خود دارند. با فراخوانی متد next() یک آبجکت با پروپرتی های value و done را بر می گرداند. ‘done’ از نوع بولین است، و بعد از خواندن همه آیتم های یک مجموعه یا کالکشن، مقدار true را بر می گرداند.
مثال 1- set و Iterator
var set = new Set(['a','b','c','d','e']); var iterator = set.entries(); console.log(iterator.next())
خروجی
{ value: [ 'a', 'a' ], done: false }
چون set کلید-مقدار را ذخیره نمی کند، مقدار این آبجکت را یک آرایه مشابه کلید-مقدار داریم. مقدار done هم برابر false است، چون هنوز عنصرهایی هستند که باید خوانده شوند.
مثال 2- set و Iterator
var set = new Set(['a','b','c','d','e']); var iterator = set.values(); console.log(iterator.next());
خروجی
{ value: 'a', done: false }
مثال 3- set و Iterator
var set = new Set(['a','b','c','d','e']); var iterator = set.keys(); console.log(iterator.next());
خروجی
{ value: 'a', done: false }
مثال 4- Map و Iterator
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.entries(); console.log(iterator.next());
خروجی
{ value: [ 1, 'one' ], done: false }
مثال 5- Map و Ierator
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.values(); console.log(iterator.next());
خروجی
{value: "one", done: false}
مثال 6- Map و Iterator
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.keys(); console.log(iterator.next());
خروجی
{value: 1, done: false}
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.