المسارات
/
JavaScript
JavaScript
/
التمارين
/
لوحة أفضل النتائج
لوحة أفضل النتائج

لوحة أفضل النتائج

تمرين تعلّمي

مقدمة

الشرح

إلى جانب أنواع البيانات الأولية مثل number وstring، هناك نوع بيانات مهم آخر في JavaScript يُسمى object. الكائنات مجموعات من أزواج المفتاح والقيمة. وبذلك يمكن استخدامها بالطريقة نفسها التي تُستخدم بها ما يُشار إليه غالبًا باسم الخرائط أو القواميس في لغات أخرى.

في لغات أخرى، غالبًا ما تحتاج جميع القيم في الخريطة إلى أن تكون من نوع البيانات نفسه. أما في JavaScript، فالنوع الوحيد المقيَّد هو نوع المفتاح: إذ يجب أن يكون string. ويمكن أن تكون القيم داخل الكائن الواحد من أنواع مختلفة. فقد تكون أنواعًا أولية مثل الأعداد، ولكنها قد تكون أيضًا مصفوفات أو كائنات أخرى أو حتى دوال. وهذا يجعل الكائنات متعددة الاستخدامات إلى حد كبير، حتى إنها تُعد أيضًا كيانات أساسية في البرمجة كائنية التوجه (OOP) في JavaScript.

في ما يلي، سنركّز على الكائنات بوصفها مجموعات أو خرائط. وسنغطي حالات استخدام أخرى للكائنات في مفاهيم أخرى، انظر مثلًا الأصناف.

إنشاء كائن

تُنشئ كائنًا باستخدام الأقواس المعقوفة. يمكنك أيضًا تضمين بعض المُدخلات مباشرة. ولذلك، اذكر المفتاح أولًا، ثم نقطتين، ثم القيمة.

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 يتضمّن المفاتيح الموروثة في تكراره.

التعليمات

في هذا التمرين، ستكتب كودًا لتتبّع أفضل النقاط لأكثر لعبة شعبية في صالة الألعاب القريبة منك.

لديك 5 دوال لتُنفّذها، ومعظمها يتعلق بالتعامل مع كائن يحمل أفضل النقاط.

1. أنشئ لوحة أفضل نقاط جديدة

أنشئ دالة createScoreBoard تُنشئ كائنًا يعمل كلوحة أفضل النقاط. ستكون مفاتيح هذا الكائن أسماء اللاعبين، وستكون قيمه نقاطهم. لأغراض الاختبار، تريد تضمين مدخل واحد مباشرةً في الكائن. يجب أن يتضمّن هذا المدخل الأولي The Best Ever اسمًا للاعب و1000000 كنقاط.

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

2. أضف لاعبين إلى لوحة أفضل النقاط

لإضافة لاعب إلى لوحة أفضل النقاط، عرّف الدالة addPlayer. وهي تقبل 3 معاملات:

  • المعامل الأول هو كائن لوحة أفضل النقاط موجود.
  • المعامل الثاني هو اسم اللاعب كسلسلة نصية.
  • المعامل الثالث هو النقاط كعدد.

تُرجع الدالة كائن لوحة أفضل النقاط نفسه الذي مُرّر إليها بعد إضافة اللاعب الجديد.

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، وهي تقبل 3 معاملات:

  • المعامل الأول هو كائن لوحة أفضل النقاط موجود.
  • المعامل الثاني هو اسم اللاعب الذي ينبغي زيادة نقاطه.
  • المعامل الثالث هو النقاط التي تريد إضافتها إلى أفضل النقاط المخزّنة.

يجب أن تُرجع الدالة لوحة أفضل النقاط بعد إجراء التحديث.

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

5. طبّق نقاط مكافأة الاثنين

تحتفظ صالة الألعاب بلوحة أفضل نقاط منفصلة أيام الاثنين. في نهاية اليوم، يحصل كل لاعب على تلك اللوحة على 100 نقطة إضافية.

نفّذ الدالة 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.