در JavaScript ، توسعه دهندگان اغلب وقت زیادی را صرف تصمیم گیری در مورد ساختار صحیح داده برای استفاده از آن ها می کنند. این امر به این دلیل است که انتخاب ساختار داده صحیح می تواند بعداً دستکاری آن داده ها را آسانتر کند ، باعث صرفه جویی در وقت و تفسیر آسان تر کد میشود. دو ساختار داده غالب برای ذخیره سازی مجموعه داده ها Objects و Arrays (نوعی Object) هستند. توسعه دهندگان برای ذخیره لیست های فهرست بندی شده از Objects استفاده می کنند. با این حال ، برای ارائه انعطاف پذیری بیشتر به توسعه دهندگان ، مشخصات ECMAScript 2015 دو نوع جدید از Objects قابل تکرار را معرفی کرد: maps ، که به آنها مجموعه ای از جفت های کلید / مقدار سفارش داده می شود ، و sets ، که مجموعه ای از مقادیر منحصر به فرد هستند.
در این مقاله به سراغ مباحث Map و Set می رویم ، چه چیزی آنها را به Objects و Arrays شبیه یا متفاوت می کند ، ویژگی ها و روش های در دسترس برای آنها ، و نمونه هایی از کاربردهای عملی.
maps
Map مجموعه ای از جفت کلیدها / مقدارهایی است که می تواند از هر نوع داده به عنوان کلید استفاده کند و می تواند ترتیب ورودی های آن را حفظ کند. Mapها هم عناصر Objects (یک مجموعه جفت کلید /مقدار منحصر به فرد) و هم Arrays (یک مجموعه مرتب شده) را دارند ، اما از نظر مفهومی بیشتر به Objectها شباهت دارند. دلیل این است که ، گرچه اندازه و ترتیب ورودی ها مانند یک Array حفظ می شود ، اما خود ورودی ها دارای جفت کلیدها و مقدار مانند Objects هستند.
Map ها را می توان با دستور new Map() مقدار اولیه داد:
const map = new Map()

این یک map خالی به ما می دهد:
Output
Map(0) {}

افزودن مقادیر به یک map
با روش set() می توانید مقادیر را به map اضافه کنید. اولین آرگومان کلید خواهد بود ، و آرگومان دوم مقدار خواهد بود.
در زیر سه جفت کلید / مقدار به map اضافه می شود:
map.set(‘firstName’, ‘Luke’)
map.set(‘lastName’, ‘Skywalker’)
map.set(‘occupation’, ‘Jedi Knight’)

در اینجا می بینیم که چگونه Maps عناصری از Objects و Arrays را دارند. مانند یک Array ، یک مجموعه دارای فهرست صفر داریم و همچنین می توانیم بطور پیش فرض تعداد موارد موجود در map را مشاهده کنیم. map ها از علامت => syntax برای نشان دادن جفت های کلید / مقدار به صورت key => value استفاده می کنند:
Output
Map(3)
0: {“firstName” => “Luke”}
1: {“lastName” => “Skywalker”}
2: {“occupation” => “Jedi Knight”}

این مثال شبیه به یک object معمولی با کلیدهای مبتنی بر رشته به نظر میرسد ، اما می توانیم از هر نوع داده به عنوان کلید با map استفاده کنیم.
علاوه بر تنظیم دستی مقادیر روی map ، می توانیم به map مقدار اولیه نیز بدهیم . این کار را با استفاده از یک آرایه ای از آرایه ها که حاوی دو عنصر است نیز میتوان انجام دهیم که هر یک جفت کلید / مقدار هستند و شبیه زیر خواهد بود :
[ [ ‘key1’, ‘value1’], [‘key2’, ‘value2’] ]
Copy

با استفاده از دستور زیر می توانیم همان map را دوباره ایجاد کنیم:
const map = new Map([
[‘firstName’, ‘Luke’],
[‘lastName’, ‘Skywalker’],
[‘occupation’, ‘Jedi Knight’],
])

توجه: در این مثال از کاما های دنباله دار استفاده می شود ، که به آن کاما آویزان نیز گفته می شود. این یک روش قالب بندی جاوا اسکریپت است که در آن آیتم نهایی در یک سری هنگام اعلام مجموعه ای از داده ها ، کاما را در انتها دارد. گرچه این انتخاب قالب بندی می تواند برای تفاوت های واضح تر و دستکاری آسانتر کد مورد استفاده قرار گیرد ، استفاده یا عدم استفاده از آن یک ترجیح است. برای کسب اطلاعات بیشتر در مورد کاماهای دنباله دار ، به این مقاله کاماهای پشت سر هم در مطالب وب MDN مراجعه کنید.

اتفاقاً ، این ترکیب همان نتیجه فراخوانی Object.entries () در یک Object است. همانطور که در بلوک کد زیر نشان داده شده ، روشی آماده برای تبدیل یک object به map فراهم می کند:
const luke = {
firstName: ‘Luke’,
lastName: ‘Skywalker’,
occupation: ‘Jedi Knight’,
}

const map = new Map(Object.entries(luke))

از طرف دیگر ، می توانید یک map را با یک خط کد به یک object یا یک آرایه برگردانید.
دستور زیر map را به یک object تبدیل می کند:
const obj = Object.fromEntries(map)
Copy

به مقدار obj زیر منجر می شود:
Output
{firstName: “Luke”, lastName: “Skywalker”, occupation: “Jedi Knight”}

اکنون ، بیایید یک map را به یک آرایه تبدیل کنیم:
const arr = Array.from(map)
Copy

این دستور منجر به آرایه زیر برای arr خواهد شد:
Output
[ [‘firstName’, ‘Luke’],
[‘lastName’, ‘Skywalker’],
[‘occupation’, ‘Jedi Knight’] ]

کلیدهای map
map ها هر نوع داده را به عنوان یک کلید قبول می کنند ، و اجازه نمی دهند مقادیر کلیدی کپی شوند. ما می توانیم با ایجاد یک map و استفاده از مقادیر غیر رشته ای به عنوان کلید ، و همچنین تنظیم دو مقدار روی یک کلید ، این عمل را نشان دهیم.
ابتدا ، بگذارید یک map را با کلیدهای بدون رشته تنظیم کنیم:
const map = new Map()

map.set(‘1’, ‘String one’)
map.set(1, ‘This will be overwritten’)
map.set(1, ‘Number one’)
map.set(true, ‘A Boolean’)

این مثال ، کلید اول 1 را با کلید بعدی لغو خواهد شد و رشته “1” و عدد 1 را به عنوان کلیدهای منحصر به فرد در نظر میگیرد:
Output
0: {“1” => “String one”}
1: {1 => “Number one”}
2: {true => “A Boolean”}

اگرچه این عقیده رایج است که یک Object معمولی JavaScript می تواند شماره ها ، بولین ها (متغیرهای دوبایتی) و سایر انواع داده های ابتدایی را به عنوان کلید مدیرت کند ، اما در واقع اینگونه نیست ، زیرا objectها همه کلیدها را به رشته تغییر می دهند.
به عنوان نمونه ، یک Object را با یک کلید عددی تنظیم کنید و مقدار یک کلید عددی 1 و یک کلید رشته ای “1” را با هم مقایسه کنید:
// Initialize an object with a numerical key
const obj = { 1: ‘One’ }

// The key is actually a string
obj[1] === obj[‘1’] // true

به همین دلیل اگر سعی کنید از یک Object به عنوان کلید استفاده کنید ، در عوض رشته object Object را چاپ می کند.
به عنوان نمونه ، یک Object ایجاد کنید و سپس آن را به عنوان کلید یک Object دیگر استفاده کنید:
// Create an object
const objAsKey = { foo: ‘bar’ }

// Use this object as the key of another object
const obj = {
[objAsKey]: ‘What will happen?’
}

منجر به خروجی زیر میشود:
Output
{[object Object]: “What will happen?”}

که شبیه حالت Map نیست. سعی کنید یک Object ایجاد کنید و آن را به عنوان کلید map تعیین کنید:
// Create an object
const objAsKey = { foo: ‘bar’ }

const map = new Map()

// Set this object as the key of a Map
map.set(objAsKey, ‘What will happen?’)

کلید عنصر Map اکنون Object ای است که ما ایجاد کرده ایم.
Output
key: {foo: “bar”}
value: “What will happen?”

نکته مهم در مورد استفاده از یک Object یا Array به عنوان یک کلید این است: map از مرجع Object برای مقایسه برابری استفاده ، نه مقدار واقعی Object . در JavaScript، {} === {} خروجی false را باز می گرداند ، زیرا دو Object با وجود یک مقدار (خالی) یکسان نیستند.
این بدان معنی است که با اضافه کردن دو Object منحصر به فرد با یک مقدار مشابه ، map ای با دو ورودی ایجاد می کنید:
// Add two unique but similar objects as keys to a Map
map.set({}, ‘One’)
map.set({}, ‘Two’)

خروجی زیر را به دست میدهد:
Output
Map(2) {{…} => “One”, {…} => “Two”}

اما با استفاده از همان مرجع Object دو بار map را با یک ورودی ایجاد می کنید.
// Add the same exact object twice as keys to a Map
const obj = {}

map.set(obj, ‘One’)
map.set(obj, ‘Two’)

که منجر به خروجی زیر خواهد شد:
Output
Map(1) {{…} => “Two”}

set() دوم ابتدا همان کلید دقیقا مشابه را به روزرسانی میکند، بنابراین ما به یک map می رسیم که فقط یک مقدار دارد.
دریافت و حذف آیتم ها از map
یکی از مضرات کار با Objects اینست که شمارش آنها یا کار با همه کلیدها یا مقادیر دشوار است. در عوض ، ساختار Map دارای ویژگی های داخلی زیادی است که کار با عناصر آنها را مستقیم تر می کند.
ما می توانیم یک map جدید را برای نشان دادن روشها و خصوصیات زیر مقداردهی کنیم: delete(), has(), get(), و  size
// Initialize a new Map
const map = new Map([
[‘animal’, ‘otter’],
[‘shape’, ‘triangle’],
[‘city’, ‘New York’],
[‘country’, ‘Bulgaria’],
])

برای بررسی وجود یک مورد در map از روش has () استفاده کنید. has() یک متغیر بولین را برمی گرداند.
// Check if a key exists in a Map
map.has(‘shark’) // false
map.has(‘country’) // true

برای بازیابی مقدار با کلید از روش get () استفاده کنید.
// Get an item from a Map
map.get(‘animal’) // “otter”

یکی از مزایای خاص Maps نسبت به objects ، این است که می توانید اندازه یک map را ، مانند یک آرایه در هر زمان پیدا کنید. می توانید تعداد آیتم ها را در یک map با ویژگی size  دریافت کنید. این کار شامل مراحل کمتری نسبت به تبدیل یک object به یک آرایه برای یافتن طول خواهد بود.
// Get the count of items in a Map
map.size // 4

برای حذف یک مورد از map با کلید از روش delete() استفاده کنید. اگر یک مورد وجود داشته باشد و حذف شود ، این روش یک حالت بولین true را بازمیگرداند و اگر با هیچ مورد مطابقت نداشته باشد ، false را نمایش میدهد.
// Delete an item from a Map by key
map.delete(‘city’) // true

این دستور منجر به map زیر خواهد شد:
Output
Map(3) {“animal” => “otter”, “shape” => “triangle”, “country” => “Bulgaria”}

سرانجام ، تمام مقادیر یک map با کل map.clear()حذف میشود.
// Empty a Map
map.clear()

این خروجی را خواهید گرفت:
Output
Map(0) {}

کلیدها ، مقادیر و ورودی ها برای map ها
Object ها می توانند با استفاده از ویژگی های سازنده Object ، کلیدها ، مقادیر و ورودی ها را بازیابی کنند. از طرف دیگر map ها دارای نمونه های اولیه هستند که به ما امکان می دهند مستقیماً کلیدها ، مقادیر و ورودی های نمونه map را بدست آوریم.
روش هایkeys(), values(),  entries() همه MapIterator را برمی گردانند ، که شبیه به یک Array است که می توانید در آن از for…of برای ایجاد حلقه بین مقادیر استفاده کنید.
در اینجا مثال دیگری از Map وجود دارد که می توانیم برای نشان دادن این روشها استفاده کنیم:
const map = new Map([
[1970, ‘bell bottoms’],
[1980, ‘leg warmers’],
[1990, ‘flannel’],
])

روش keys() کلیدها را برمی گرداند:
map.keys()
Output
MapIterator {1970, 1980, 1990}

روش values() مقادیر را برمی گرداند:
map.values()
Output
MapIterator {“bell bottoms”, “leg warmers”, “flannel”}

روش entries() آرایه ای از جفت کلید ها/ مقدار را برمی گرداند:
map.entries()
Output
MapIterator {1970 => “bell bottoms”, 1980 => “leg warmers”, 1990 => “flannel”}

 

هر دو روش خروجی زیر را به دست میدهد:
Output
hi
hello
good day

ویژگی ها و روش های set
در جدول زیر لیستی از ویژگی ها و روش های set برای ارجاع سریع نشان داده شده است:
ویژگی ها/روش ها توصیف خروجی
add(value) آیتم جدیدی را به Set وارد میکند Set Object
delete(value) آیتم مشخصی را از Set حذف میکند Boolean
has() وجود آیتمی را در Set بررسی میکند Boolean
clear() تمام آیتم ها را از Set حذف میکند N/A
keys() تمام مقادیر را به set بازمیگرداند مشابه values() SetIterator object
values() تمام مقادیر را به set برمیگرداند مشابه keys() SetIterator object
entries() تمام مقادیر را به صورت [value, value] به set برمیگرداند SetIterator object
forEach() به ترتیب ورود در set تکرار میشود N/A
size تعداد آیتم ها در set را میدهد Number
زمان استفاده از set
set افزونه مفیدی برای ابزار JavaScript است ، به خصوص برای کار با مقادیر تکراری در داده ها.
در یک خط واحد ، می توانیم یک Array جدید بدون مقادیر تکراری از یک Array ایجاد کنیم که دارای مقادیر تکراری باشد.
const uniqueArray = [ …new Set([1, 1, 2, 2, 2, 3])] // (3) [1, 2, 3]
Copy

خروجی زیر را می دهد:
Output
(3) [1, 2, 3]

set می تواند برای یافتن اجماع ، فصل مشترک و تفاوت بین دو مجموعه داده استفاده شود. با این وجود ، آرایه ها به دلیل داشتن روشهای sort(), map(), filter(), و reduce() و همچنین سازگاری مستقیم با روشهای JSON از مزیت قابل توجهی نسبت به Sets برای دستکاری بیشتر داده ها برخوردار هستند.
نتیجه
در این مقاله ، شما آموختید که یک map مجموعه ای از جفت کلید / مقدار سفارشی است ، و set مجموعه ای از مقادیر منحصر به فرد میباشد. هر دوی این ساختارهای داده قابلیت های بیشتری را به JavaScript اضافه می کنند و به ترتیب کارهای ساده ای مانند یافتن طول مجموعه جفت کلید / مقدار و حذف موارد تکراری از یک مجموعه داده را ساده می کنند. از طرف دیگر ، Objects و Arrays به طور معمول برای ذخیره سازی داده ها و دستکاری در JavaScript مورد استفاده قرار گرفته اند ، و سازگاری مستقیمی با JSON دارند که همچنان آنها را به اساسی ترین ساختار داده ها ، به ویژه برای کار با REST API ها تبدیل می کند. map ها و set ها در درجه اول به عنوان ساختارهای پشتیبانی داده برای Objects و Arrays مفید هستند.
اگر می خواهید در مورد جاوا اسکریپت بیشتر بدانید ، از صفحه اصلی کددهی در مجموعه JavaScript دیدن کنید ، یا به مقاله های مربوط به کد دهی در Node.js مراجعه کنید.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان –