Треки
/
JavaScript
JavaScript
/
Вправи
/
Табло рекордів
Табло рекордів

Табло рекордів

Навчальна вправа

Вступ

Пояснення

Окрім примітивних типів даних, як-от number і string, у JavaScript є ще один важливий тип даних під назвою object. Обʼєкти - це набори пар ключ-значення. Тож їх можна використовувати так само, як те, що в інших мовах часто називають мапами або словниками.

В інших мовах усі значення в мапі часто мають бути одного типу даних. У JavaScript обмежено лише тип ключа: він має бути string. Значення всередині одного обʼєкта можуть мати різні типи. Вони можуть бути примітивними типами, як-от числа, але також масивами, іншими обʼєктами чи навіть функціями. Це робить обʼєкти надзвичайно універсальними, тому вони також є ключовими сутностями для обʼєктно-орієнтованого програмування (ООП) у 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, лапки можна опустити. А для ключів зі спеціальними символами в назві потрібно використати звичайний запис рядка тексту (англ. string).

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 параметри:

  • Перший параметр - наявний обʼєкт таблиці рекордів.
  • Другий параметр - імʼя гравця як рядок тексту (англ. string).
  • Третій параметр - рахунок як число.

Функція повертає той самий обʼєкт таблиці рекордів, який було передано, після додавання нового гравця.

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

3. Видаліть гравців з таблиці рекордів

Якщо гравці порушують правила залу ігрових автоматів, їх вручну видаляють з таблиці рекордів. Визначте removePlayer, яка приймає 2 параметри:

  • Перший параметр - наявний обʼєкт таблиці рекордів.
  • Другий параметр - імʼя гравця як рядок тексту.

Ця функція повинна видалити запис указаного гравця з таблиці та повернути таблицю після цього. Якщо гравця взагалі не було в таблиці, з таблицею нічого не повинно статися. Її треба повернути без змін.

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 вправ та справжнє наставництво від людей, і все це безкоштовно.