التحويل باستخدام 'map'
جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 10 من 65.
عندما تحتاج إلى تحويل كل عنصر في قائمة إلى شيء جديد، توفر Dart طريقة map() القوية. تطبق هذه الطريقة دالة تحويل على كل عنصر في القائمة وتنشئ قائمة جديدة تحتوي على جميع النتائج المحولة.
تأخذ الطريقة map() دالة كمعامل لها تحدد كيفية تحويل كل عنصر. تستقبل هذه الدالة كل عنصر من القائمة الأصلية وتعيد النسخة المحولة. ثم تقوم الطريقة map() بجمع كل هذه القيم المحولة في قائمة جديدة.
List<int> numbers = [1, 2, 3, 4, 5];
// تحويل كل رقم عن طريق مضاعفته
var doubled = numbers.map((number) => number * 2);
print(doubled); // (2, 4, 6, 8, 10)هذا النهج أكثر أناقة بكثير من إنشاء قائمة جديدة يدويًا واستخدام حلقة لتحويل كل عنصر. تمثل طريقة map() مفهومًا أساسيًا في البرمجة الوظيفية، مما يسمح لك بالتعبير عن تحويلات البيانات بطريقة واضحة وموجزة.
التحدي
سهلقم بإنشاء برنامج يدير نظام تسعير المنتجات من خلال تطبيق تعديلات الأسعار القائمة على النسبة المئوية لجميع العناصر في مخزون المتجر. يجب على برنامجك القيام بما يلي:
- قراءة مدخل نصي (string) يمثل اسم المتجر
- قراءة مدخلات عشرية متعددة تمثل أسعار المنتجات الأصلية (سينتهي الإدخال عندما تتلقى
-1) - قراءة مدخل عشري يمثل نسبة التعديل (موجبة لزيادة السعر، وسالبة للخصم)
- استخدام طريقة
map()لتحويل كل سعر عن طريق تطبيق تعديل النسبة المئوية - طباعة نتائج تعديل الأسعار بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كان اسم المتجر هو "Tech Store"، والأسعار هي 99.99، 149.50، 79.99، 199.99، والتعديل هو 15.0 (زيادة بنسبة 15%)، يجب أن يخرج برنامجك ما يلي:
Store: Tech Store
Original prices: [99.99, 149.5, 79.99, 199.99]
Applying 15.0% adjustment
Adjusted prices: (114.9885, 171.925, 91.9885, 229.9885)
Total items processed: 4
Status: Price adjustment completedإذا كان اسم المتجر هو "Fashion Outlet"، والأسعار هي 29.99، 45.00، والتعديل هو -20.0 (خصم بنسبة 20%)، يجب أن يخرج برنامجك ما يلي:
Store: Fashion Outlet
Original prices: [29.99, 45.0]
Applying -20.0% adjustment
Adjusted prices: (23.992, 36.0)
Total items processed: 2
Status: Price adjustment completedإذا كان اسم المتجر هو "Book Corner" وتم توفير سعر واحد فقط 12.50 مع تعديل 0.0، يجب أن يخرج برنامجك ما يلي:
Store: Book Corner
Original prices: [12.5]
Applying 0.0% adjustment
Adjusted prices: (12.5)
Total items processed: 1
Status: Price adjustment completedيجب أن يستخدم برنامجك طريقة map() مع وظيفة تحويل تحسب السعر الجديد باستخدام الصيغة: originalPrice * (1 + percentage / 100). يجب أن تعيد طريقة map() كائناً قابلاً للتكرار (iterable) يحتوي على جميع الأسعار المعدلة، والتي سيتم عرضها بتنسيق الأقواس.
ورقة مرجعية
تقوم طريقة map() بتحويل كل عنصر في القائمة من خلال تطبيق دالة على كل عنصر وإنشاء قائمة جديدة بالنتائج.
تأخذ طريقة map() دالة كمعامل (parameter) يحدد التحويل. تستقبل هذه الدالة كل عنصر وتعيد النسخة المحولة:
List<int> numbers = [1, 2, 3, 4, 5];
// تحويل كل رقم بمضاعفته
var doubled = numbers.map((number) => number * 2);
print(doubled); // (2, 4, 6, 8, 10)هذا أكثر أناقة من إنشاء قائمة جديدة يدوياً واستخدام الحلقات (loops) للتحويل.
جرّب بنفسك
import 'dart:io';
void main() {
// قراءة اسم المتجر
String? storeName = stdin.readLineSync();
// قراءة الأسعار حتى يتم إدخال -1
List<double> prices = [];
while (true) {
String? input = stdin.readLineSync();
double price = double.parse(input!);
if (price == -1) {
break;
}
prices.add(price);
}
// قراءة نسبة التعديل
String? adjustmentInput = stdin.readLineSync();
double adjustment = double.parse(adjustmentInput!);
// TODO: اكتب الكود الخاص بك أدناه
// استخدم الدالة map() لتطبيق تعديل النسبة المئوية على جميع الأسعار
// المعادلة: originalPrice * (1 + percentage / 100)
// طباعة النتائج
print('Store: $storeName');
print('Original prices: $prices');
print('Applying $adjustment% adjustment');
// طباعة الأسعار المعدلة بتنسيق الأقواس
// طباعة إجمالي العناصر التي تمت معالجتها
// طباعة رسالة الحالة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التعامل المتقدم مع القوائم
خصائص القائمة: first و lastحالة القائمة: isEmpty و isNotEmptyعكس القائمةالإضافة إلى القائمة: insertالحذف من القائمة: removeWhereالبحث في القائمة: indexOfفرز القائمةخلط القائمةملخص - منظم القوائم4معالجة الـ Map المتقدمة
التكرار عبر الـ Mapالتحقق من المفاتيح والقيمخصائص الـ Map: keys و valuesإضافة مشروطة: putIfAbsentإزالة العناصر من الـ Mapالـ Maps المتداخلةمراجعة - تحديث المخزون2عمليات القوائم الوظيفية
التحويل باستخدام 'map'التصفية باستخدام 'where'استخدام '.toList()'التحقق من الشروط باستخدام 'any'الشروط باستخدام 'every'البحث باستخدام 'firstWhere'مراجعة - تصفية البيانات5مشروع: حاسبة عربة التسوق
إعداد المشروعإضافة العناصر إلى العربة3المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة