✍️ حالا اجزای پروژه را به یک تابع قابل استفاده وصل میکنیم. گزارش نهایی سه تصمیم مستقل دارد: چند سفارش paid معتبر داریم، جمع درآمدشان چقدر است و کدام مشتری بیشترین مجموع خرید را دارد. مشتری برتر را از مبلغ یک سفارش انتخاب نکن؛ ممکنه چند خرید کوچک یک نفر از خرید بزرگ فرد دیگری بیشتر بشه.
قرارداد داده در تمام پروژه ثابت است: orders اگر آرایه نباشد، دادهای نداریم. هر ردیف معتبر باید شیء غیرnull و غیرآرایه باشد؛ status دقیقاً 'paid' یا 'cancelled'، customer رشتهای با trim غیرخالی و total عدد واقعی متناهی نامنفی باشد. نام مشتری با trim یکسانسازی میشود؛ حروف بزرگ و کوچک متفاوتاند. ویژگی اضافه مجاز است. ردیف نامعتبر نادیده گرفته میشود و چیزی در ورودی تغییر نمیکند.
در تساوی مجموع خرید، مشتریای برنده است که اولین سفارش paid معتبرش زودتر در ورودی آمده؛ نه کسی که زودتر به یک مجموع موقت رسیده. برای نمونه خریدهای آوا ۲، نیما ۵ و دوباره آوا ۳، مجموع هر دو را پنج میکنه و آوا برنده است. اول جمع همه گروهها را کامل کن، بعد با ترتیب اولین حضورشان برنده را انتخاب کن.
خطای رایج، جایگزین کردن برنده در برابری است. فقط مبلغ واقعاً بیشتر باید برنده قبلی را عوض کنه. نامهای عددنما هم مجازند؛ Map ترتیب اولین حضور را بدون مرتبسازی کلیدها نگه میداره. helper آماده فقط تغییر نکردن ورودی را بررسی میکنه و لازم نیست آن را بازنویسی کنی.
فعالیت شما
summarizeOrders(orders) را بنویس. قرارداد داده در تمام پروژه ثابت است: orders اگر آرایه نباشد، دادهای نداریم. هر ردیف معتبر باید شیء غیرnull و غیرآرایه باشد؛ status دقیقاً 'paid' یا 'cancelled'، customer رشتهای با trim غیرخالی و total عدد واقعی متناهی نامنفی باشد. نام مشتری با trim یکسانسازی میشود؛ حروف بزرگ و کوچک متفاوتاند. ویژگی اضافه مجاز است. ردیف نامعتبر نادیده گرفته میشود و چیزی در ورودی تغییر نمیکند. فقط paid معتبر را حساب کن و دقیقاً {paidCount,revenue,topCustomer} بده: تعداد سفارشها، جمع total بدون گرد کردن، و نام trimشده مشتری با بیشترین مجموع خرید. تساوی => اولین حضور paid معتبر آن مشتری در ورودی. نام عددنما و 'proto' هم مجاز است. بدون paid معتبر => {paidCount:0,revenue:0,topCustomer:null}. paid صفر شمرده میشود و میتواند برنده باشد. نمونه [آوا 2، نیما 5، آوا 3] => {paidCount:3,revenue:10,topCustomer:'آوا'}. ورودی و اشیایش تغییر نکنند. checkOrdersUnchanged آماده است و برای بررسی این شرط استفاده میشود.