Map هو كائن (object) خاص يسمح لك بتخزين أزواج مفتاح-قيمة (key-value pairs)، زي الـ Object لكن مع ميزات إضافية:
- يمكن أن تكون المفاتيح من أي نوع (أرقام، كائنات، دوال، …)، مش بس نصوص أو رموز مثل الـ Object.
- يحفظ ترتيب الإضافة، يعني لما تتكرر عليه، القيم ترجع بنفس ترتيب الإضافة.
- له خصائص ودوال مخصصة لتسهيل التعامل مع البيانات.
🚫 الفرق بين Map و Object
| خاصية | Map | Object |
|---|---|---|
| نوع المفاتيح | أي نوع (object، function، أي شيء) | نصوص أو رموز فقط |
| ترتيب التكرار | يحفظ ترتيب الإضافة | غير مضمون (في بعض الحالات) |
| طريقة التكرار | يدعم التكرار مباشرة | يحتاج لـ Object.keys أو for...in |
| الحجم | يمكن الحصول عليه بـ .size | لا توجد خاصية مباشرة |
| أداء إضافة/حذف | أسرع في كثير من الحالات | أبطأ قليلاً |
📌 كيفية إنشاء Map
const map = new Map();JavaScript🔑 إضافة عناصر (key-value pairs)
map.set('name', 'Ali');
map.set(123, 'a number key');
map.set({ id: 1 }, 'object key');JavaScript👀 قراءة القيم
console.log(map.get('name')); // 'Ali'
console.log(map.get(123)); // 'a number key'JavaScript🔄 التحقق من وجود مفتاح
console.log(map.has('name')); // true
console.log(map.has('age')); // falseJavaScript❌ حذف عنصر
map.delete('name');
console.log(map.has('name')); // falseJavaScript🔄 التكرار على Map
map.forEach((value, key) => {
console.log(key, value);
});JavaScriptأو باستخدام for...of مع destructuring:
for (const [key, value] of map) {
console.log(key, value);
}JavaScript📏 معرفة حجم الـ Map
console.log(map.size); // عدد العناصر داخل الـ MapJavaScriptمثال كامل:
const map = new Map();
map.set('name', 'Ali');
map.set(1, 'one');
map.set({ id: 1 }, 'an object key');
console.log(map.get('name')); // Ali
console.log(map.size); // 3
map.forEach((value, key) => {
console.log(key, value);
});JavaScript🕒 متى تستخدم Map؟
1. تحتاج مفاتيح من أي نوع (ليست فقط نصوص أو رموز)
- في
Object، المفاتيح تتحول دائمًا إلى نصوص. - في
Map، يمكنك استخدام أشياء مثل كائنات (Objects)، دوال (Functions)، أو حتى قيم أخرى كمفاتيح.
2. تريد الحفاظ على ترتيب الإدخال
Mapيحتفظ بترتيب الأزواج التي أُضيفت (key-value pairs).- التكرار على
Mapسيكون بنفس ترتيب الإضافة. - في
Object، الترتيب غير مضمون أو معقد قليلاً (خصوصًا مع مفاتيح الأعداد).
3. تحتاج إلى أداء أفضل مع الكثير من الإضافات والحذف
Mapغالبًا أسرع في عمليات الإضافة، الحذف، والبحث، خصوصًا عندما تكون هناك بيانات كثيرة.
4. تريد معرفة حجم المجموعة بسهولة
Mapتوفر خاصية.sizeمباشرة.- في
Object، يجب حساب عدد المفاتيح باستخدامObject.keys(obj).length.
5. عندما تحتاج للتكرار المباشر على الأزواج
Mapقابل للتكرار مباشرة عبرfor...ofأوforEach.Objectيحتاج خطوات إضافية للتحويل إلى مصفوفات المفاتيح أو القيم.
❌ متى تستخدم Object بدلًا من Map؟
- إذا كنت تحتاج كائنًا بسيطًا لتخزين بيانات معروفة ومفتاحية نصية فقط.
- إذا كنت تريد دعم أوسع في البيئات القديمة (مع أن معظم البيئات الحديثة تدعم
Map). - عندما تريد بنية بيانات تقليدية دون تعقيد.
ملخص:
| الحالة | استخدم Map | استخدم Object |
|---|---|---|
| مفاتيح ليست نصوصًا فقط | ✅ | ❌ |
| ترتيب المفاتيح مهم | ✅ | ❌ (غير مضمون) |
| تحتاج معرفة الحجم بسرعة | ✅ | ❌ (تحتاج حساب يدوي) |
| بنية بيانات بسيطة | ❌ | ✅ |
| تريد تكرار سهل وواضح | ✅ | ❌ |