مسیرها
/
JavaScript
JavaScript
/
تمرین‌ها
/
تخته‌ی امتیازات برتر
تخته‌ی امتیازات برتر

تخته‌ی امتیازات برتر

تمرین یادگیری

مقدمه

توضیح

علاوه بر انواع داده‌ی اولیه مثل number و string، یک نوع داده‌ی مهم دیگر هم در JavaScript وجود دارد که به آن object می‌گویند. «شیءها» مجموعه‌هایی از جفت‌های کلید-مقدار هستند. به همین دلیل، می‌توان از آن‌ها به همان شکلی استفاده کرد که از آنچه در زبان‌های دیگر معمولاً «نقشه» یا «دیکشنری» نامیده می‌شود.

در زبان‌های دیگر، معمولاً همه‌ی مقدارهای یک نقشه باید نوع داده‌ی یکسانی داشته باشند. در JavaScript فقط نوع کلید محدود است: باید string باشد. مقدارهای داخل یک شیء می‌توانند نوع‌های متفاوتی داشته باشند. این مقدارها می‌توانند انواع اولیه مثل عدد باشند، اما می‌توانند آرایه، شیءهای دیگر یا حتی تابع هم باشند. همین ویژگی شیءها را بسیار انعطاف‌پذیر می‌کند، تا جایی که در JavaScript به یکی از موجودیت‌های کلیدی برنامه‌نویسی شیءگرا (OOP) تبدیل می‌شوند.

در ادامه، روی شیءها به عنوان مجموعه یا نقشه تمرکز می‌کنیم. کاربردهای دیگر شیءها در مفاهیم دیگر بررسی می‌شوند، برای نمونه کلاس.

ساختن یک شیء

برای ساختن یک شیء از «آکولاد» استفاده می‌کنید. می‌توانید چند مورد را هم مستقیم داخل آن بگذارید. برای این کار، اول کلید را بنویسید، بعد از آن دونقطه و سپس مقدار را.

const emptyObject = {};

const obj = {
  favoriteNumber: 42,
  greeting: 'Hello World',
  useGreeting: true,
  address: {
    street: 'Trincomalee Highway',
    city: 'Batticaloa',
  },
  fruits: ['melon', 'papaya'],
  addNumbers: function (a, b) {
    return a + b;
  },
};

کامای انتهایی بعد از آخرین مورد در JavaScript اختیاری است.

شاید برایتان سؤال پیش بیاید که چرا کلیدها داخل گیومه قرار نگرفته‌اند، هرچند قرار است رشته باشند. این یک شکل کوتاه‌نویسی است. اگر کلید از قواعد نام‌گذاری شناسه در JavaScript پیروی کند، می‌توانید گیومه‌ها را حذف کنید. برای کلیدهایی که در اسمشان نویسه‌های خاص دارند، باید از همان نوشتار معمول رشته استفاده کنید.

const obj = {
  '1keyStartsWithNumber': '...',
  'key/with/slashes': '...',
  'key-with-dashes': '...',
  'key with spaces': '...',
  '#&()[]{}èä樹keyWithSpecialChars': '...',
};

بازیابی یک مقدار

برای گرفتن مقدار یک کلید مشخص، دو راه وجود دارد: «نوشتار نقطه‌ای» و «نوشتار کروشه‌ای».

const obj = { greeting: 'hello world' };

obj.greeting;
// => hello world

obj['greeting'];
// => hello world

// Bracket notation also works with variables.
const key = 'greeting';
obj[key];
// => hello world

استفاده از نوشتار نقطه‌ای به شکل کوتاه، همان محدودیت حذف گیومه‌ها را دارد. این روش فقط وقتی کار می‌کند که کلید از قواعد نام‌گذاری شناسه پیروی کند.

افزودن یا تغییر یک مقدار

می‌توانید با عملگر انتساب = یک مقدار را اضافه یا تغییر دهید. باز هم نوشتار نقطه‌ای و کروشه‌ای در دسترس هستند.

const obj = { greeting: 'hello world' };

obj.greeting = 'Hi there!';
obj['greeting'] = 'Welcome.';

obj.newKey1 = 'new value 1';
obj['new key 2'] = 'new value 2';

const key = 'new key 3';
obj[key] = 'new value 3';

حذف یک مورد

می‌توانید با کلیدواژه‌ی delete یک جفت کلید-مقدار را از یک شیء حذف کنید.

const obj = {
  key1: 'value1',
  key2: 'value2',
};

delete obj.key1;
delete obj['key2'];

بررسی وجود یک کلید

می‌توانید با متد hasOwnProperty بررسی کنید که آیا کلید خاصی در یک شیء وجود دارد یا نه.

const obj = { greeting: 'hello world' };

obj.hasOwnProperty('greeting');
// => true

obj.hasOwnProperty('age');
// => false

پیمایش یک شیء

یک «حلقه‌ی ویژه» به اسم for...in وجود دارد که روی همه‌ی کلیدهای یک شیء پیمایش می‌کند.

const obj = {
  name: 'Ali',
  age: 65,
};

for (let key in obj) {
  console.log(key, obj[key]);
}
// name Ali
// age 65

برای جلوگیری از خطاهای ظریف، همیشه باید فرض کنید که حلقه‌ی for...in کلیدها را با ترتیب دلخواهی پیمایش می‌کند. همچنین توجه داشته باشید که for...in کلیدهای ارث‌بری‌شده را هم در پیمایش خود لحاظ می‌کند.

دستورالعمل‌ها

در این تمرین، راهی را پیاده‌سازی می‌کنید که با آن بتوانید امتیازهای برتر محبوب‌ترین بازی سالن بازی محلی‌تان را پیگیری کنید.

باید ۵ تابع را پیاده‌سازی کنید که بیشترشان به دستکاری شیئی مربوط می‌شوند که امتیازهای برتر را نگه می‌دارد.

1. یک تخته امتیازهای برتر جدید بسازید

تابعی به اسم createScoreBoard بسازید که شیئی را می‌سازد و نقش تخته امتیازهای برتر را ایفا می‌کند. کلیدهای این شیء اسم بازیکنان خواهند بود و مقدارها امتیاز آنان. برای اهداف Test، می‌خواهید یک ورودی را مستقیماً در شیء بگنجانید. این ورودی اولیه باید از The Best Ever به عنوان اسم بازیکن و 1000000 به عنوان امتیاز تشکیل شده باشد.

createScoreBoard();
// returns an object with one initial entry

2. بازیکنان را به تخته امتیاز اضافه کنید

برای افزودن بازیکن به تخته امتیازهای برتر، تابع addPlayer را تعریف کنید. این تابع ۳ پارامتر می‌پذیرد:

  • پارامتر اول یک شیء تخته امتیاز موجود است.
  • پارامتر دوم اسم بازیکن به صورت رشته است.
  • پارامتر سوم امتیاز به صورت عدد است.

تابع پس از افزودن بازیکن جدید، همان شیء تخته امتیازی را که به آن پاس داده شده بود برمی‌گرداند.

addPlayer({ 'Dave Thomas': 0 }, 'José Valim', 486373);
// => {'Dave Thomas': 0, 'José Valim': 486373}

3. بازیکنان را از تخته امتیاز حذف کنید

اگر بازیکنان قوانین سالن بازی را زیر پا بگذارند، به صورت دستی از تخته امتیازهای برتر حذف می‌شوند. تابع removePlayer را تعریف کنید که ۲ پارامتر می‌گیرد:

  • پارامتر اول یک شیء تخته امتیاز موجود است.
  • پارامتر دوم اسم بازیکن به صورت رشته است.

این تابع باید ورودی مربوط به بازیکن داده‌شده را از تخته حذف کند و سپس تخته را برگرداند. اگر بازیکن از ابتدا روی تخته نبود، نباید هیچ اتفاقی برای تخته بیفتد. باید همان‌طور که هست برگردانده شود.

removePlayer({ 'Dave Thomas': 0 }, 'Dave Thomas');
// => {}

removePlayer({ 'Dave Thomas': 0 }, 'Rose Fanaras');
// => { 'Dave Thomas': 0 }

4. امتیاز یک بازیکن را افزایش دهید

اگر بازیکنی بازی دیگری را در سالن بازی تمام کند، مقدار مشخصی امتیاز به امتیاز قبلی روی تخته اضافه می‌شود. تابع updateScore را پیاده‌سازی کنید که ۳ پارامتر می‌گیرد:

  • پارامتر اول یک شیء تخته امتیاز موجود است.
  • پارامتر دوم اسم بازیکنی است که امتیازش باید افزایش یابد.
  • پارامتر سوم امتیازی است که می‌خواهید به امتیاز برتر ذخیره‌شده اضافه کنید.

تابع باید پس از انجام به‌روزرسانی، تخته امتیاز را برگرداند.

updateScore({ 'Freyja Ćirić': 12771008 }, 'Freyja Ćirić', 73);
// => {"Freyja Ćirić", 12771081}

5. امتیازهای پاداش دوشنبه را اعمال کنید

سالن بازی روزهای دوشنبه یک تخته امتیاز جداگانه دارد. در پایان روز، هر بازیکنی که در آن تخته فهرست شده است، ۱۰۰ امتیاز اضافه می‌گیرد.

تابع applyMondayBonus را پیاده‌سازی کنید که یک تخته امتیاز می‌پذیرد. این تابع امتیازهای پاداش را برای هر بازیکنی که در آن تخته فهرست شده است اضافه می‌کند. سپس تخته برگردانده می‌شود.

const scoreBoard = {
  'Dave Thomas': 44,
  'Freyja Ćirić': 539,
  'José Valim': 265,
};

applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
JavaScript Exercism

آماده‌اید تخته‌ی امتیازات برتر را شروع کنید؟

در Exercism ثبت‌نام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.