✍️ مجموع درآمد باید فقط از همان فهرست سفارشهای قابل محاسبه ساخته بشه. باگ رایج این مرحله اینه که بعد از نوشتن تابع انتخاب، برای راحتی دوباره روی کل 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 فقط تغییر نکردن ورودی و، هرجا لازم است، تازه بودن خروجی را بررسی میکند؛ آن را تغییر نده.