🧠 ما هي Map في Dart؟
Map هي بنية بيانات (Data Structure) تُستخدم لتخزين أزواج من المفتاح والقيمة (key => value).
كل مفتاح في Map يجب أن يكون فريدًا، ولكن القيم يمكن أن تتكرر.
تشبه Dictionary في Python أو Object في JavaScript.
✅ تعريف بسيط:
void main() {
Map<String, int> ages = {
'Ali': 25,
'Sara': 30,
'Omar': 22,
};
print(ages['Sara']); // 30
}PHP✅ طريقة إنشاء Map
1. باستخدام الأقواس {}:
Map<String, int> myMap = {'a': 1, 'b': 2};PHP2. باستخدام الدالة Map():
Map<String, String> cities = Map();
cities['Egypt'] = 'Cairo';
cities['France'] = 'Paris';PHP3. خريطة فارغة:
Map<String, int> empty = {};PHP📌 الخصائص الأساسية
| الخاصية / الدالة | الوصف |
|---|---|
map[key] | الوصول للقيمة المرتبطة بالمفتاح |
map[key] = value | تعيين قيمة لمفتاح |
addAll({}) | إضافة عناصر جديدة |
containsKey(key) | التحقق من وجود مفتاح |
containsValue(value) | التحقق من وجود قيمة |
remove(key) | حذف عنصر |
length | عدد العناصر |
isEmpty / isNotEmpty | هل الخريطة فارغة؟ |
clear() | حذف جميع العناصر |
🧪 أمثلة عملية
🔹 إضافة وتعديل القيم:
var user = {'name': 'Yasin', 'age': 26};
user['age'] = 27; // تعديل
user['country'] = 'Egypt'; // إضافةPHP🔹 التكرار على Map:
user.forEach((key, value) {
print('$key: $value');
});PHPأو باستخدام for in:
for (var entry in user.entries) {
print('${entry.key} => ${entry.value}');
}PHP🔍 البحث والتحقق
print(user.containsKey('name')); // true
print(user.containsValue('Egypt')); // truePHP🔁 تحويل Map إلى List
var keys = user.keys.toList(); // ['name', 'age', 'country']
var values = user.values.toList(); // ['Yasin', 27, 'Egypt']PHP🧩 التحديث المشروط
user.update('name', (oldValue) => 'Ahmed'); // إذا وُجد
user.update('city', (v) => 'Cairo', ifAbsent: () => 'Cairo'); // إذا لم يوجدPHP🔥 حذف عنصر
user.remove('age');PHP🧠 استخدام Map المتداخلة
Map<String, Map<String, dynamic>> students = {
'Ali': {'age': 22, 'grade': 'A'},
'Sara': {'age': 23, 'grade': 'B'},
};
print(students['Ali']?['grade']); // APHP⚠️ محاذير هامة
| المحذور | التوضيح |
|---|---|
| تعديل القيم أثناء التكرار | قد يسبب خطأ أو نتائج غير متوقعة |
| المفاتيح لا تُكرر | إدخال مفتاح موجود مسبقًا يستبدل القديم |
Map غير مرتبة (في النوع العادي) | استخدم LinkedHashMap إذا أردت الحفاظ على الترتيب |
| استخدام كائن كـ key بدون hashCode | سيتسبب في سلوك غير متوقع |
🏗️ أنواع Map في Dart
| النوع | الوصف |
|---|---|
Map (الافتراضي) | غير مرتب |
LinkedHashMap | يحافظ على ترتيب الإدخال |
SplayTreeMap | يُرتب المفاتيح تلقائيًا |
HashMap | أسرع نوع، لا يحافظ على ترتيب |
مثال:
import 'dart:collection';
void main() {
var map = SplayTreeMap<String, int>();
map['c'] = 3;
map['a'] = 1;
map['b'] = 2;
print(map); // {a: 1, b: 2, c: 3}
}PHP✅ الفرق بين Map و Set و List
| الخاصية | Map | Set | List |
|---|---|---|---|
| نوع المحتوى | مفتاح => قيمة | قيمة فريدة فقط | أي قيم (تكرار مسموح) |
| ترتيب العناصر؟ | لا (إلا LinkedHash) | لا (إلا LinkedHashSet) | نعم |
| يقبل التكرار؟ | لا للمفاتيح | لا | نعم |
| الوصول للعناصر | بالمفتاح | لا يوجد فهرس | بالفهرس |
🧠 متى أستخدم Map؟
استخدم Map عندما:
- تحتاج إلى ربط مفتاح بقيمة (مثل: الاسم => العمر)
- تحتاج إلى البحث السريع بالقيمة المرتبطة بمفتاح
- تحتاج إلى تمثيل JSON
- تخزين بيانات منظمة لها معرف
📦 مثال عملي نهائي
Map<String, dynamic> product = {
'id': 101,
'name': 'Laptop',
'price': 1500,
'available': true,
};
print('اسم المنتج: ${product['name']}');
if (product.containsKey('price')) {
print('السعر: ${product['price']}');
}
product['price'] = 1400; // تعديل السعر
product.remove('available');
print('المنتج النهائي:');
product.forEach((k, v) => print('$k => $v'));PHP