✍️ برای شناخت مشتریها، مجموع خرید هر نام را جدا نگه میداریم. نامی که بعد از trim یکسان است، به یک گروه تعلق دارد. پس سفارش «آوا» و سفارش « آوا » باید در یک کلید جمع بشن. این مرحله بعداً مبنای انتخاب مشتری برتر میشه؛ اگر گروهبندی اشتباه باشد، انتخاب برنده هم قابل اعتماد نیست.
مثلاً خریدهای ۲۰ و ۳۰ یک مشتری، مجموع پنجاه میسازند؛ نگه داشتن فقط آخرین مبلغ، مجموع را به سی کاهش میده. برای هر نام، مقدار قبلی را بخوان، نبودنش را صفر بگیر و مبلغ تازه را اضافه کن. از نظر منطق، این همان شمارش وضعیتهاست با این تفاوت که به جای یک، مبلغ سفارش اضافه میکنیم.
قرارداد داده در تمام پروژه ثابت است: orders اگر آرایه نباشد، دادهای نداریم. هر ردیف معتبر باید شیء غیرnull و غیرآرایه باشد؛ status دقیقاً 'paid' یا 'cancelled'، customer رشتهای با trim غیرخالی و total عدد واقعی متناهی نامنفی باشد. نام مشتری با trim یکسانسازی میشود؛ حروف بزرگ و کوچک متفاوتاند. ویژگی اضافه مجاز است. ردیف نامعتبر نادیده گرفته میشود و چیزی در ورودی تغییر نمیکند.
نامهای مشتری محدود به چند کلمه نمونه نیستند. نامی مثل __proto__ هم یک رشته مجاز است؛ برای جدول جمع از Object.create(null) یا ساختاری امن مثل Map استفاده کن. خطای رایج، اتکا به ویژگیهای ارثی شیء معمولی است. خروجی نهایی باید یک شیء JSON از نام به عدد باشد و هیچ گروه لغوشدهای نداشته باشه.
فعالیت شما
customerTotals(orders) را کامل کن. قرارداد داده در تمام پروژه ثابت است: orders اگر آرایه نباشد، دادهای نداریم. هر ردیف معتبر باید شیء غیرnull و غیرآرایه باشد؛ status دقیقاً 'paid' یا 'cancelled'، customer رشتهای با trim غیرخالی و total عدد واقعی متناهی نامنفی باشد. نام مشتری با trim یکسانسازی میشود؛ حروف بزرگ و کوچک متفاوتاند. ویژگی اضافه مجاز است. ردیف نامعتبر نادیده گرفته میشود و چیزی در ورودی تغییر نمیکند. فقط paid معتبر را بر اساس customer.trim() گروهبندی و total را جمع کن. خروجی شیء نام به مبلغ است؛ paidهای « آوا » 20 و «آوا» 30 => {'آوا':50}؛ cancelled حذف، بدون داده => {}. تمام نامهای غیرخالی از جمله 'proto' مجازند. تابع کمکی آماده checkCustomerTotalsUnchanged فقط تغییر نکردن ورودی و، هرجا لازم است، تازه بودن خروجی را بررسی میکند؛ آن را تغییر نده.