
بسم الله الرحمن الرحيم والصلاة على من بعت رحمة للعالمين سيد الأولين والأخرين سيدنا محمد صلى الله عليه وأله وسلم
أما بعد ... إخواني أحبائي وأصدقائي أهلا بكم... ندخل صلب الموضوع سلام حار لكل متصفح للموضوع وكل عضو بالمنتدى 
سنتحدث اليوم إن شاء الله عن إحدى أقوى الدوال في الجافا سكريبت ألا وهي Reduce دالة reduce في J ava Sc ript تُستخدم لتقليل مصفوفة إلى قيمة واحدة بناءً على دالة معينة. تعمل reduce عن طريق تطبيق الدالة المحددة على كل عنصر في المصفوفة، مع تجميع النتائج إلى قيمة واحدة تمثل الناتج النهائي. 
قبل البدء : وجب التنبيه على أنني سأستخذم extension خاصة وهي Live Server حتى نتمكن من متابعة التغييرات أول بأول 
سنقوم بإنشاء مجلد خاص بالدرس يحتوي على ملفين أساسيين و اللذان سنستخذمهما في هذا الدرس 
في ملف index.html سنقوم بعمل تمبلت الخاصة بHtml 5 
بعض التعديلات على السريع في ملف index حيث سنقوم بتعريف ملف jS الخاص بنا 

قبل شرح دالة Reduce تعال نشوف كيف يمكننا القيام بعملية الجمع عن طريق دالة ForEach 
في البداية نقوم بتعريف مصفوفة متكونة من أعداد عشوائية من إختيارنا “ ليس مشكلا أن تكون الأعداد مكونة من أرقام سالبة أو موجبة” سميتها groceryList “ تبقى التسمية خيارا لكم كما تشاؤون” نعرف متغيرا بإسم Total نجعله Let حتى نتمكن من التعديل عليه فيما بعد بحيث سيخزن فيه مجموع الأعداد التي في المصفوفة السابقة نعمل Looping على المصفوفة عن طريق ForEach والتي تقبل متغير سنسميه price حيث سيحمل في كل مره قيمة عدد من المصفوفة GroceryList هنا total += price سنعمل على جمع الأعداد وتخزينها في المتغير Total خلف الكواليس هكذا ستشتغل الدالة 
النتيجة المتحصل عليها في Console.log(total) 
وهكذا حتى ننتهي من جميع أعداد الموجودة في المصفوفة 
ربما هذه الطريقة ليست المحببة في مثل هذه الأوضاع حيث تأتي دالة Reduce لتجعل الأمور أكثر بساطة وتقلل إمكانية الوقوع في الأخطاء لنرى كيفية عمل هذه الدالة القوية في J S “ وربما صعبة للوهلة الأولى لكن مع الأمثلة ستستطيعون فهمها أكثر” 
سنعتمد على نفس المصفوفة السابقة بالنسبة لهذه الدالة فتحتاج إلى ** Call Back Fun ct ion ** والتي تحتاج بدورها إلى محددين ‘Parameters’ غالبا الأول هو *Accumulator* وهو في هذه الحالة سيكون العدد المتراكم أما الثاني فهو *CurrentValue* وهو القيمة الحالية المتوصل إليها **القيمة الإبتدائية** في هذه الحالة نريد البدء من الصفر في الأخير سنحصل على النتيجة نفسها كما في Foreach 
فكيف تشتغل هذه الدالة خلف الكواليس 
كما لو قلنا أنه accumulator هو نفسه total و CurrentValue هي price في المثال السابق 
كما يمكننا من خلال دالة Reduce الحصول على القيمة الأكبر بين أعداد المتواجدة في المصفوفة 
هنا سنضع في Callback fun ction دالة الرياضيات الخاصة ب J S وهي Math.max والتي تعطينا قيمة الأكبر بين الأعداد مصفوفة معينة ثم في القيمة الافتراضية فستكون -Infinity سنحصل في الأخير على 110 كأكبر قيمة بين الأعداد في مصفوفتنا 

ما يميز دالة Reduce هو أنا لا تتعامل فقط مع الأعداد فحسب بل تتخطاه إلى النصوص في المثال الموالي سنرى كيف يمكننا استخراج جملة إنطلاقا من مجموعة كلمات في مصفوفة ** بطبيعة الحال الكلمات فهي مرتبة لكي تعطينا جملة مفيدة** 
في هذا المثال هكذا ستعمل دالة Reduce 
بنفس المبدأ فهي تلف على قيم المصفوفة ثم تقوم بتخزينها بالتوالي حسب ما تريده أنت 
مثال أخر للتعامل مع الأعداد التجميع للإحصائيات يمكن استخدام reduce لحساب الإحصائيات مثل المتوسط أو العدد الإجمالي للعناصر التي تلبي شرطًا معينًا. 
accumulator يبدأ بالقيمة الابتدائية { count: 0, sum: 0 } .
currentValue هو العنصر الحالي في المصفوفة أثناء عملية التكرار.
ما يحدث في كل تكرار Loop: accumulator.count++ : يقوم بزيادة العداد count بمقدار 1 لكل عنصر في المصفوفة.
accumulator.sum += currentValue : يقوم بإضافة القيمة الحالية currentValue إلى المجموع sum .
return accumulator : يُرجع الكائن accumulator بعد تحديث القيم.
النتيجة النهائية 
كما ترى عزيزي القارئ دالة ال Reduce هي دالة قوية تمكمن قوة دالة reduce في --SS-- في قدرتها على إجراء عمليات تحويل وتجميع متقدمة على المصفوفات بطرق مرنة وقوية 
سأعطي مثال أخير لكنه شوي متقدم سنتعامل من خلاله مع Object 
في هذه المرة وعلى عكس الأمثلة السابقة فهنا سنتعامل مع Object وليس Array **هنا نقوم بتعريف كائن data يحتوي على ثلاثة مفاتيح Keys (أسماء الأشخاص) وقيم Values (أعمارهم). Object.keys(data): هذه الدالة تُرجع مصفوفة تحتوي على جميع المفاتيح keys (الأسماء) في الكائن data. النتيجة ستكون: ['Alice', 'Bob', 'Carol']. .reduce((accumulator, key) => { ... }, []): هنا دالة reduce سنُستخدمها لتقليل مصفوفة إلى قيمة واحدة بناءً على دالة push. تبدأ بـ accumulator كقيمة ابتدائية، وهي في هذه الحالة مصفوفة فارغة []. key هي المفتاح الحالي من المصفوفة التي تحتوي على المفاتيح ['Alice', 'Bob', 'Carol']. data[key] تُعطي القيمة المقابلة للمفتاح في الكائن data (أي العمر). accumulator.push({ name: key, age: data[key] }): نقوم بإضافة كائن جديد إلى accumulator يحتوي على name كاسم الشخص وage كعمر الشخص.
return accumulator: نقوم بإرجاع accumulator لتستمر العملية حتى النهاية.
النتيجة المتحصل عليها هي مصفوفة جديدة بها أسماء الأعضاء و أعمارهم 
أتمنى أن تكونوا فهمتم المثال الأخير رغم أنه مثال متقدم 
والسلام عليكم ورحمة الله وبركاته 
|