Parcours
/
JavaScript
JavaScript
/
Exercices
/
Tableau des meilleurs scores
Tableau des meilleurs scores

Tableau des meilleurs scores

Exercice d'apprentissage

Introduction

Explication

Outre les types de données primitifs comme number et string, il existe en JavaScript un autre type de données important : object. Les objets sont des collections de paires clé-valeur. À ce titre, on peut les utiliser de la même manière que ce que d'autres langages appellent souvent des tables associatives ou des dictionnaires.

Dans d'autres langages, toutes les valeurs d'une table associative doivent souvent avoir le même type de données. En JavaScript, seul le type de la clé est contraint : il doit s'agir d'une string. Les valeurs d'un même objet peuvent avoir des types différents. Elles peuvent être des types primitifs comme les nombres, mais aussi des tableaux, d'autres objets ou même des fonctions. Les objets sont donc très polyvalents, ce qui en fait aussi des entités clés de la programmation orientée objet (POO) en JavaScript.

Dans ce qui suit, on va s'intéresser aux objets en tant que collections ou tables associatives. D'autres utilisations des objets seront abordées dans d'autres concepts, voir par exemple les classes.

Crée un objet

On crée un objet à l'aide d'accolades. Tu peux aussi y inclure directement des entrées. Pour cela, indique d'abord la clé, puis un deux-points et la valeur.

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;
  },
};

La virgule finale après la dernière entrée est facultative en JavaScript.

Tu te demandes peut-être pourquoi les clés ne sont pas entourées de guillemets alors qu'elles sont censées être des strings. C'est une notation abrégée. Si la clé respecte les règles de nommage d'un identifiant JavaScript, tu peux omettre les guillemets. Pour les clés dont le nom contient des caractères spéciaux, il faut utiliser la notation habituelle, avec des guillemets.

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

Récupère une valeur

Il y a deux façons de récupérer la valeur associée à une clé donnée : la notation pointée et la notation avec crochets.

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

Utiliser la notation pointée comme raccourci impose la même restriction que l'omission des guillemets. Elle ne fonctionne que si la clé respecte les règles de nommage des identifiants.

Ajoute ou modifie une valeur

Tu peux ajouter ou modifier une valeur à l'aide de l'opérateur d'affectation =. Là encore, les notations pointée et avec crochets sont disponibles.

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';

Supprime une entrée

Tu peux supprimer une paire clé-valeur d'un objet à l'aide du mot-clé delete.

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

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

Vérifie si une clé existe

Tu peux vérifier si une clé donnée existe dans un objet avec la méthode hasOwnProperty.

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

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

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

Parcours un objet

Il existe une boucle spéciale for...in pour parcourir toutes les clés d'un objet.

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

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

Pour éviter des erreurs subtiles, considère toujours que la boucle for...in parcourt les clés dans un ordre arbitraire. Sache aussi que for...in inclut les clés héritées dans son itération.

Instructions

Dans cet exercice, tu vas mettre en place un moyen de garder une trace des meilleurs scores du jeu le plus populaire de ta salle d'arcade.

Tu as 5 fonctions à implémenter, qui servent principalement à manipuler un objet contenant les meilleurs scores.

1. Crée un nouveau tableau des meilleurs scores

Crée une fonction createScoreBoard qui crée un objet servant de tableau des meilleurs scores. Les clés de cet objet seront les noms des joueurs et les valeurs, leurs scores. Pour les besoins des tests, tu veux inclure directement une entrée dans l'objet. Cette entrée initiale doit contenir The Best Ever comme nom de joueur et 1000000 comme score.

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

2. Ajoute des joueurs à un tableau des meilleurs scores

Pour ajouter un joueur au tableau des meilleurs scores, définis la fonction addPlayer. Elle prend 3 paramètres :

  • Le premier paramètre est un objet existant qui représente le tableau des meilleurs scores.
  • Le deuxième paramètre est le nom d'un joueur, sous forme de string.
  • Le troisième paramètre est le score, sous forme de nombre.

La fonction renvoie le même objet tableau des meilleurs scores qui lui a été passé, après avoir ajouté le nouveau joueur.

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

3. Retire des joueurs d'un tableau des meilleurs scores

Si des joueurs enfreignent les règles de la salle d'arcade, ils sont retirés manuellement du tableau des meilleurs scores. Définis removePlayer, qui prend 2 paramètres :

  • Le premier paramètre est un objet existant qui représente le tableau des meilleurs scores.
  • Le deuxième paramètre est le nom du joueur, sous forme de string.

Cette fonction doit retirer du tableau l'entrée correspondant au joueur donné, puis renvoyer le tableau. Si le joueur n'était pas présent sur le tableau au départ, rien ne doit changer et le tableau doit être renvoyé tel quel.

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

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

4. Augmente le score d'un joueur

Si un joueur termine une nouvelle partie dans la salle d'arcade, un certain nombre de points est ajouté à son score précédent sur le tableau. Implémente updateScore, qui prend 3 paramètres :

  • Le premier paramètre est un objet existant qui représente le tableau des meilleurs scores.
  • Le deuxième paramètre est le nom du joueur dont le score doit être augmenté.
  • Le troisième paramètre est le score que tu souhaites ajouter au meilleur score enregistré.

La fonction doit renvoyer le tableau des meilleurs scores une fois la mise à jour effectuée.

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

5. Applique les points bonus du lundi

Le lundi, la salle d'arcade tient un tableau des meilleurs scores distinct. À la fin de la journée, chaque joueur inscrit sur ce tableau reçoit 100 points supplémentaires.

Implémente la fonction applyMondayBonus, qui prend un tableau des meilleurs scores. La fonction ajoute les points bonus à chaque joueur inscrit sur ce tableau, puis renvoie le tableau.

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

applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
JavaScript Exercism

Prêt à commencer Tableau des meilleurs scores ?

Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.