Rutas
/
JavaScript
JavaScript
/
Ejercicios
/
Tabla de puntuaciones
Tabla de puntuaciones

Tabla de puntuaciones

Ejercicio de aprendizaje

Introducción

Explicación

Además de los tipos de datos primitivos como number y string, en JavaScript hay otro tipo de datos importante llamado object. Los objetos son colecciones de pares clave-valor. Como tales, se pueden usar igual que lo que en otros lenguajes se suele denominar mapas o diccionarios.

En otros lenguajes, a menudo todos los valores de un mapa tienen que tener el mismo tipo de dato. En JavaScript, solo se restringe el tipo de la clave: tiene que ser un string. Los valores dentro de un mismo objeto pueden tener tipos distintos. Pueden ser tipos primitivos como números, pero también arrays, otros objetos o incluso funciones. Esto hace que los objetos sean muy versátiles, hasta el punto de que también son entidades clave para la programación orientada a objetos (POO) en JavaScript.

A continuación, nos centraremos en los objetos como colecciones o mapas. Otros casos de uso de los objetos se tratarán en otros conceptos; consulta, por ejemplo, Clases.

Crear un objeto

Creas un objeto usando llaves. También puedes incluir algunas entradas directamente. Para ello, indica primero la clave, seguida de dos puntos y el 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;
  },
};

La coma final después de la última entrada es opcional en JavaScript.

Quizá te preguntes por qué las claves no van entre comillas aunque se supone que son strings. Se trata de una notación abreviada. Si la clave sigue las reglas de nomenclatura de un identificador de JavaScript, puedes omitir las comillas. Para las claves con caracteres especiales en el nombre, tienes que usar la notación habitual de string.

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

Recuperar un valor

Hay dos formas de recuperar el valor de una clave dada: la notación de punto y la notación de corchetes.

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 la notación de punto como abreviatura tiene la misma restricción que omitir las comillas. Solo funciona si la clave sigue las reglas de nomenclatura de los identificadores.

Añadir o cambiar un valor

Puedes añadir o cambiar un valor con el operador de asignación =. De nuevo, tienes disponibles la notación de punto y la de corchetes.

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 una entrada

Puedes eliminar un par clave-valor de un objeto con la palabra clave delete.

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

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

Comprobar si existe una clave

Puedes comprobar si una determinada clave existe en un objeto con el método hasOwnProperty.

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

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

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

Recorrer un objeto con un bucle

Existe un bucle for...in especial para iterar sobre todas las claves de un objeto.

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

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

Para evitar errores sutiles, debes asumir siempre que el bucle for...in recorre las claves en un orden arbitrario. Además, ten en cuenta que for...in incluye las claves heredadas en su iteración.

Instrucciones

En este ejercicio vas a implementar una forma de llevar un registro de las puntuaciones más altas del juego más popular de tu salón recreativo local.

Tienes 5 funciones que implementar, relacionadas en su mayoría con la manipulación de un objeto que contiene puntuaciones altas.

1. Crear un nuevo marcador de puntuaciones

Crea una función createScoreBoard que cree un objeto que sirva como marcador de puntuaciones. Las claves de este objeto serán los nombres de los jugadores y los valores, sus puntuaciones. Para poder hacer pruebas, quieres incluir directamente una entrada en el objeto. Esta entrada inicial debe constar de The Best Ever como nombre del jugador y 1000000 como puntuación.

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

2. Añadir jugadores a un marcador de puntuaciones

Para añadir un jugador al marcador de puntuaciones, define la función addPlayer. Acepta 3 parámetros:

  • El primer parámetro es un objeto marcador de puntuaciones existente.
  • El segundo parámetro es el nombre de un jugador como string.
  • El tercer parámetro es la puntuación como número.

La función devuelve el mismo objeto marcador de puntuaciones que se le pasó, después de añadir al nuevo jugador.

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

3. Eliminar jugadores de un marcador de puntuaciones

Si los jugadores infringen las normas del salón recreativo, se les elimina manualmente del marcador de puntuaciones. Define removePlayer, que acepta 2 parámetros:

  • El primer parámetro es un objeto marcador de puntuaciones existente.
  • El segundo parámetro es el nombre del jugador como string.

Esta función debe eliminar del marcador la entrada del jugador indicado y devolver el marcador a continuación. Si el jugador no estaba en el marcador, no debe pasarle nada al marcador. Se debe devolver tal cual.

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

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

4. Aumentar la puntuación de un jugador

Si un jugador termina otra partida en el salón recreativo, se añadirá cierta cantidad de puntos a la puntuación anterior del marcador. Implementa updateScore, que acepta 3 parámetros:

  • El primer parámetro es un objeto marcador de puntuaciones existente.
  • El segundo parámetro es el nombre del jugador cuya puntuación se debe aumentar.
  • El tercer parámetro es la puntuación que quieres añadir a la puntuación alta almacenada.

La función debe devolver el marcador una vez hecha la actualización.

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

5. Aplicar los puntos de bonificación de los lunes

Los lunes, el salón recreativo lleva un marcador aparte. Al final del día, cada jugador de ese marcador recibe 100 puntos adicionales.

Implementa la función applyMondayBonus, que acepta un marcador de puntuaciones. La función añade los puntos de bonificación a cada jugador que aparece en ese marcador. Después, se devuelve el marcador.

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

applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
JavaScript Exercism

¿Listo para empezar Tabla de puntuaciones?

Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.