Percursos
/
JavaScript
JavaScript
/
Exercícios
/
Quadro de Recordes
Quadro de Recordes

Quadro de Recordes

Exercício de aprendizagem

Introdução

Explicação

Para além dos tipos de dados primitivos como number e string, existe em JavaScript outro tipo de dados importante chamado object. Os objetos são coleções de pares chave-valor. Como tal, podem ser usados da mesma forma que aquilo a que noutras linguagens se chama muitas vezes mapas ou dicionários.

Noutras linguagens, todos os valores de um mapa têm frequentemente de ter o mesmo tipo de dados. Em JavaScript, só o tipo da chave está restringido: tem de ser uma string. Os valores dentro de um mesmo objeto podem ter tipos diferentes. Podem ser tipos primitivos como números, mas também arrays, outros objetos ou até funções. Isto torna os objetos muito versáteis, ao ponto de serem também entidades centrais para a programação orientada a objetos (POO) em JavaScript.

A seguir, vamos focar-nos nos objetos enquanto coleções ou mapas. Outros casos de uso dos objetos serão abordados noutros conceitos, vê por exemplo Classes.

Criar um objeto

Crias um objeto com chavetas. Também podes incluir algumas entradas diretamente. Para isso, indica primeiro a chave, seguida de dois pontos e do valor.

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

A vírgula final depois da última entrada é opcional em JavaScript.

Podes perguntar-te porque é que as chaves não estão entre aspas, apesar de se supor que são strings. É uma notação abreviada. Se a chave seguir as regras de nomenclatura de um identificador de JavaScript, podes omitir as aspas. Para chaves com carateres especiais no nome, tens de usar a notação habitual de strings.

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

Obter um valor

Há duas formas de obter o valor de uma determinada chave: a notação de ponto e a notação de parênteses retos.

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

Usar a notação de ponto como forma abreviada tem a mesma restrição que omitir as aspas. Só funciona se a chave seguir as regras de nomenclatura de identificadores.

Adicionar ou alterar um valor

Podes adicionar ou alterar um valor com o operador de atribuição =. Mais uma vez, tens à disposição a notação de ponto e a notação de parênteses retos.

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

Eliminar uma entrada

Podes eliminar um par chave-valor de um objeto com a palavra-chave delete.

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

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

Verificar se uma chave existe

Podes verificar se uma determinada chave existe num objeto com o método hasOwnProperty.

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

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

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

Percorrer um objeto com um ciclo

Existe um ciclo especial for...in para iterar sobre todas as chaves de um objeto.

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

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

Para evitares erros subtis, deves assumir sempre que o ciclo for...in visita as chaves por uma ordem arbitrária. Além disso, tem em atenção que o for...in inclui chaves herdadas na sua iteração.

Instruções

Neste exercício, vais implementar uma forma de acompanhar os recordes do jogo mais popular do teu salão de jogos.

Tens 5 funções para implementar, a maioria relacionadas com a manipulação de um objeto que guarda recordes.

1. Cria uma nova tabela de recordes

Cria uma função createScoreBoard que cria um objeto que serve de tabela de recordes. As chaves deste objeto serão os nomes dos jogadores e os valores serão as suas pontuações. Para efeitos de teste, queres incluir diretamente uma entrada no objeto. Esta entrada inicial deve ser composta por The Best Ever como nome do jogador e 1000000 como pontuação.

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

2. Adiciona jogadores a uma tabela de recordes

Para adicionar um jogador à tabela de recordes, define a função addPlayer. Aceita 3 parâmetros:

  • O primeiro parâmetro é um objeto de tabela de recordes existente.
  • O segundo parâmetro é o nome de um jogador, como string.
  • O terceiro parâmetro é a pontuação, como número.

A função devolve o mesmo objeto de tabela de recordes que recebeu, depois de adicionar o novo jogador.

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

3. Remove jogadores de uma tabela de recordes

Se os jogadores violarem as regras do salão de jogos, são removidos manualmente da tabela de recordes. Define removePlayer, que recebe 2 parâmetros:

  • O primeiro parâmetro é um objeto de tabela de recordes existente.
  • O segundo parâmetro é o nome do jogador, como string.

Esta função deve remover da tabela a entrada do jogador indicado e devolver a tabela em seguida. Se o jogador não estiver na tabela, não deve acontecer nada à tabela. Deve ser devolvida tal como está.

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

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

4. Aumenta a pontuação de um jogador

Se um jogador terminar outro jogo no salão, uma certa quantidade de pontos será adicionada à pontuação anterior na tabela. Implementa updateScore, que recebe 3 parâmetros:

  • O primeiro parâmetro é um objeto de tabela de recordes existente.
  • O segundo parâmetro é o nome do jogador cuja pontuação deve ser aumentada.
  • O terceiro parâmetro é a pontuação que queres adicionar à pontuação guardada.

A função deve devolver a tabela depois de feita a atualização.

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

5. Aplica os pontos de bónus de segunda-feira

O salão de jogos mantém uma tabela de recordes separada às segundas-feiras. No fim do dia, cada jogador dessa tabela recebe 100 pontos adicionais.

Implementa a função applyMondayBonus, que aceita uma tabela de recordes. A função adiciona os pontos de bónus a cada jogador que esteja listado nessa tabela. Depois, devolve a tabela.

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

applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
Editar via GitHub A ligação abre numa nova janela ou separador
JavaScript Exercism

Estás pronto para começar Quadro de Recordes?

Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.