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

پروژه گروه‌بندی جاوااسکریپت؛ مجموع خرید هر مشتری

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

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

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

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

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

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

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

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

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 paidRows(orders) {
  if (!Array.isArray(orders)) return [];
  return orders.map(normalizeOrder).filter(row => row !== null && row.status === 'paid');
}
function customerTotals(orders) {
  // TODO: جدول امن مجموع خریدها را بساز.
}
function checkCustomerTotalsUnchanged(orders) {
  const before = JSON.stringify([orders]);
  const result = customerTotals(orders);
  return JSON.stringify([orders]) === before && true;
}