حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش جاوااسکریپت تکمیلی؛ توابع و پردازش داده

پروژه reduce در جاوااسکریپت؛ رفع باگ درآمد سفارش‌ها

پروژه گزارش سفارش‌ها در جاوااسکریپت · 0٪

✍️ مجموع درآمد باید فقط از همان فهرست سفارش‌های قابل محاسبه ساخته بشه. باگ رایج این مرحله اینه که بعد از نوشتن تابع انتخاب، برای راحتی دوباره روی کل orders پیمایش کنیم. در این صورت سفارش لغوشده یا ردیف خراب ممکنه به جمع برگرده و تصمیم مرحله قبل بی‌اثر بشه.

مثلاً یک سفارش paid با مبلغ ۶۰ و یک سفارش cancelled با مبلغ ۲۰۰ داریم. درآمد درست ۶۰ است، نه ۲۶۰. مبلغ صفر معتبره و به جمع چیزی اضافه نمی‌کنه؛ عدد منفی اصلاً ردیف معتبر نیست. این‌ها سه حالت متفاوت‌اند و نباید با یک شرط کلی «مبلغ دارد» مدیریت بشن.

قرارداد داده در تمام پروژه ثابت است: orders اگر آرایه نباشد، داده‌ای نداریم. هر ردیف معتبر باید شیء غیرnull و غیرآرایه باشد؛ status دقیقاً 'paid' یا 'cancelled'، customer رشته‌ای با trim غیرخالی و total عدد واقعی متناهی نامنفی باشد. نام مشتری با trim یکسان‌سازی می‌شود؛ حروف بزرگ و کوچک متفاوت‌اند. ویژگی اضافه مجاز است. ردیف نامعتبر نادیده گرفته می‌شود و چیزی در ورودی تغییر نمی‌کند.

تابع درآمد فقط عدد برمی‌گردونه و برای نبود سفارش معتبر، صفر دارد. از reduce با مقدار آغازین صفر یا حلقه دارای جمع اولیه صفر استفاده کن. خطای رایج، استفاده از مقدار پیش‌فرض total با || یا تبدیل رشته با Number است؛ اعتبارسنجی دقیق باید قبل از جمع انجام شده باشه و هیچ تبدیل حدسی لازم نیست.

فعالیت شما

orderRevenue(orders) را اصلاح کن. قرارداد داده در تمام پروژه ثابت است: orders اگر آرایه نباشد، داده‌ای نداریم. هر ردیف معتبر باید شیء غیرnull و غیرآرایه باشد؛ status دقیقاً 'paid' یا 'cancelled'، customer رشته‌ای با trim غیرخالی و total عدد واقعی متناهی نامنفی باشد. نام مشتری با trim یکسان‌سازی می‌شود؛ حروف بزرگ و کوچک متفاوت‌اند. ویژگی اضافه مجاز است. ردیف نامعتبر نادیده گرفته می‌شود و چیزی در ورودی تغییر نمی‌کند. جمع total فقط paidهای معتبر را بدون گرد کردن برگردان؛ paid 60 و cancelled 200 => 60. سفارش صفر معتبر است؛ خالی، ورودی غیرآرایه یا نبود paid معتبر => 0. تابع کمکی آماده checkOrderRevenueUnchanged فقط تغییر نکردن ورودی و، هرجا لازم است، تازه بودن خروجی را بررسی می‌کند؛ آن را تغییر نده.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

فعالیت‌های این بخش به اشتراک فعال نیاز دارند. تهیهٔ اشتراک

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

function normalizeOrder(row) {
  if (row === null || typeof row !== 'object' || Array.isArray(row)) return null;
  if (row.status !== 'paid' && row.status !== 'cancelled') return null;
  if (typeof row.customer !== 'string' || row.customer.trim() === '') return null;
  if (typeof row.total !== 'number' || !Number.isFinite(row.total) || row.total < 0) return null;
  return {status:row.status,customer:row.customer.trim(),total:row.total};
}
function orderRevenue(orders) {
  // TODO: سفارش‌های معتبر paid را پیدا و total را جمع کن.
}
function checkOrderRevenueUnchanged(orders) {
  const before = JSON.stringify([orders]);
  const result = orderRevenue(orders);
  return JSON.stringify([orders]) === before && true;
}