فصل شانزدهم: کالکشن ها در اکما اسکریپت

18 شهریور 1397
es6-collections

اکما اسکرپیت 6 دو ساختار داده ای جدید را معرفی کرده است: Map و Set.

  • Map:این ساختار داده، امکان نگاشت یک کلید با یک مقدار را برای ما فراهم می کند.
  • Set: Setها مانند آرایه ها هستند.

Map

آبجکت Map در حقیقت یک جفت کلید/مقدار است. این کلید/مقدار می تواند از نوع های اولیه یا آبجکت باشد.

سینتکس آن مطابق زیر است

new Map([iterable])

پارامتر iterable هر آبجکت iterableیی که عناصرش یک کلید و مقدار دارد را نمایش می دهد. Mapها مرتب شده هستند، یعنی به همان ترتیبی که عناصرش داخل آن قرار گرفته باشد، پیمایش می شوند.

پروپرتی های Map 

# پروپرتی توضیحات
1 Map.prototype.size این متد تعداد جفت کلید-مقدار موجود در یک آبجکت را بر میگرداند

درک نحوه کارکرد Map

تابع 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

متدهای Map

# متد توضیحات
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ها مشابه map معمولی هستند، با این تفاوت که:

  • کلید آن باید یک آبجکت باشد
  • یک weak map می تواند جمع آوری حافظه را انجام دهد. جمع آوری حافظه یک فرآیندی است که در آن حافظه اشغال شده توسط آبجکت هایی که هیچ ارجاعی به آنها وجود ندارد، پاکسازی می شود
  • یک weak 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 ها

یک set یک ساختار داده در اکما اسکریپت 6 است. یک set مشابه یک آرایه است با این تفاوت که نمی تواند شامل مقادیر تکراری باشد. به عبارت دیگر فقط مقادیر منحصر به فرد باید در آن ذخیره کنید. set ها از مقادیر اولیه و آبجکت ها پشتیبانی می کنند.

مشابه map ،setها هم مرتب شده هستند. یعنی عناصر به همان ترتیبی که در آن درج شده اند، پیمایش می شود.

پروپرتی های Set

# پروپرتی توضیحات
1 Set.prototype.size تعداد مقادیر یک آبجکت set را بر می گرداند

متدهای 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}
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.