دالة Reduce
جزء من قسم Logic & Flow في رحلة JavaScript على Coddy. الدرس 54 من 65.
تسمح لك طريقة reduce() بـ "تقليل" array إلى قيمة واحدة عن طريق تنفيذ function محدودة لكل عنصر في array. يمكن أن تكون هذه القيمة الواحدة رقمًا أو سلسلة نصية أو object أو حتى array آخر.
فيما يلي بناء الجملة الخاص بـ reducer:
array.reduce(function(accumulator, currentValue, currentIndex, array) {
// أرجع قيمة الـ accumulator المحدّثة
}, initialValue);المكونات الرئيسية:
- accumulator: يجمع القيم المعادة من دالة الاستدعاء (callback) (فكر فيه كإجمالي تراكمي)
- currentValue: العنصر الحالي الذي يتم معالجته في array
- currentIndex: (اختياري) فهرس العنصر الحالي
- array: (اختياري) المصفوفة التي تم استدعاء reduce() عليها
- initialValue: (اختياري) قيمة تُستخدم كأول وسيط في الاستدعاء الأول لدالة الاستدعاء (callback function)
على سبيل المثال - مجموع الأعداد:
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum); // 15كيف يعمل خطوة بخطوة:
const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, curr) => {
console.log(`Accumulator: ${acc}, Current Value: ${curr}`);
return acc + curr;
}, 0);
// المخرجات:
// المتراكم: 0، القيمة الحالية: 1
// المتراكم: 1، القيمة الحالية: 2
// المتراكم: 3، القيمة الحالية: 3
// المتراكم: 6، القيمة الحالية: 4
// النتيجة النهائية: 10التحدي
سهلقم بإنشاء دالة باسم calculateGroceryTotal تأخذ مصفوفة من الكائنات (objects) التي تمثل عناصر البقالة.
كل كائن يحتوي على خاصيتين:
name: نص (اسم العنصر)price: رقم (سعر العنصر)
يجب على الدالة القيام بما يلي:
- حساب التكلفة الإجمالية لجميع العناصر
- تطبيق خصم: - إذا كان الإجمالي أكبر من 100، يتم تطبيق خصم 10%
- إذا كان الإجمالي أكبر من 50 وأقل من أو يساوي 100، يتم تطبيق خصم 5%
- لا يوجد خصم للإجمالي الذي يساوي 50 أو أقل.
إرجاع كائن يحتوي على:
originalTotal: المجموع قبل الخصمdiscount: المبلغ المخصومfinalTotal: المبلغ النهائي بعد الخصم
جرّب بنفسك
function calculateGroceryTotal(items) {
// اكتب الكود هنا
return {
originalTotal: Math.round(originalTotal * 100) / 100, // قرّب إلى منزلتين عشريتين
discount: Math.round(discount * 100) / 100,
finalTotal: Math.round(finalTotal * 100) / 100
};
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1السلاسل النصية بعمق
أساسيات السلاسل النصيةالتكرار عبر السلاسل النصيةTemplate Literalsدوال السلاسل النصيةمراجعة - String Weaver2المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفات ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادمراجعة - المصفوفات ثنائية الأبعادجمع وطرح المصفوفاتالمصفوفات المتعرجة (Jagged Arrays)المصفوفات ثلاثية الأبعاد وما بعدهاأنماط المصفوفات ثنائية الأبعاد الشائعةمراجعة - كل شيء عن المصفوفات5المجموعات - الجزء الأول
ما هي المجموعة؟التكرار عبر المجموعاتإضافة عنصرإزالة عنصرالتحقق من وجود عنصرالحجم وهل هي فارغةالنسخ والمسحملخص - أساسيات المجموعات8مواضيع شيقة حول الـ Arrays
تفكيك الـ Arrayاستخدام الـ Spread Syntax في الـ Arraysالـ Sparse Arraysمراجعة - ورشة عمل الـ Arrays3JSON الجزء الأول
ما هو JSON؟التحقق من وجود المفتاحObject MethodsSpread Operator الجزء الأولSpread Operator الجزء الثانيحذف المفاتيحمراجعة - معالجة مفاتيح JSON6المجموعات - الجزء الثاني
الرياضيات - اتحاد المجموعاتالرياضيات - تقاطع المجموعاتالرياضيات - الفرق بين المجموعاتالرياضيات - الفرق المتناظرالمجموعات الجزئية والمجموعات الفائقةمراجعة - مجموعات الأصدقاء9دوال المصفوفات المتقدمة
دالتا Join و Splitدالة Mapدالة Filterدالة Reduceتسلسل دوال المصفوفاتهل ForEach و Map متماثلتان؟دالة Sortدالتا Find و FindIndexمراجعة - محترف التسلسلتدرّب بنفسك: مترجم JavaScript عبر الإنترنت