Rutas
/
JavaScript
JavaScript
/
Ejercicios
/
Parque de atracciones
Parque de atracciones

Parque de atracciones

Ejercicio de aprendizaje

Introducción

A diferencia de muchos otros lenguajes, en JavaScript hay dos entidades distintas que representan la ausencia de un valor (significativo). Existen null y undefined.

Null

El valor primitivo null se usa como un «valor vacío» intencionado para variables de cualquier tipo.

let name = null;
// name is intentionally set to "empty" because it is not
// available

Puedes comprobar si una variable es null con el operador de igualdad estricta ===.

let name = null;

name === null;
// => true

Undefined

Una variable a la que no se le ha asignado un valor es de tipo undefined.1

Esto significa que, mientras que null representa un valor vacío (pero sigue siendo un valor), undefined representa la ausencia total de un valor. 🤯

undefined aparece en distintos contextos.

  • Si una variable se declara sin un valor (inicialización), es undefined.
  • Si intentas acceder al valor de una clave inexistente en un objeto, obtienes undefined.
  • Si una función no devuelve un valor, el resultado es undefined.
  • Si no se pasa un argumento a una función, este es undefined, a menos que ese argumento tenga un valor predeterminado.
let name;
console.log(name);
// => undefined

Puedes comprobar si una variable es undefined con el operador de igualdad estricta ===.

let name;

name === undefined;
// => true

Encadenamiento opcional

Si intentas obtener un valor anidado en un objeto pero la clave padre no existe, JavaScript lanzará un error. Para evitar esto fácilmente, el encadenamiento opcional se añadió a la especificación del lenguaje en 2020. Con el operador de encadenamiento opcional ?. puedes asegurarte de que JavaScript solo intente acceder a la clave anidada si el padre no era null ni undefined. En caso contrario, se devuelve undefined.

const obj = {
  address: {
    street: 'Trincomalee Highway',
    city: 'Batticaloa',
  },
};

obj.address.zipCode;
// => undefined

obj.residence.street;
// => TypeError: Cannot read property 'street' of undefined

obj.residence?.street;
// => undefined

Coalescencia nula

Hay situaciones en las que quieres aplicar un valor predeterminado por si una variable es null o undefined (pero solo en ese caso). Para resolver esto, el operador de coalescencia nula ?? se introdujo en 2020. Devuelve el operando de la derecha solo cuando el operando de la izquierda es null o undefined. En caso contrario, se devuelve el operando de la izquierda.

let amount = null;
amount = amount ?? 1;
// => 1

amount = 0;
amount = amount ?? 1;
// => 0

[1] Undefined, MDN. (2021). https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined (consultado el 4 de junio de 2021).

Instrucciones

Tu trabajo consiste en proporcionar y mantener partes del sistema informático de un parque de atracciones. En concreto, eres responsable del programa que gestiona a los visitantes y las entradas.

Primero, crearás un nuevo visitante en el sistema. Después, proporcionarás una función para revocar una entrada. En las tareas 3 y 4, trabajarás en el sistema de seguimiento de entradas que ayuda a evitar la falsificación. Por último, ayudarás a adaptar el sistema a los nuevos requisitos legales.

1. Crea un nuevo visitante

Cuando los visitantes llegan al parque de atracciones por primera vez, tienen que registrarse introduciendo su nombre y su edad en un terminal y aceptando los términos y condiciones. Por supuesto, también tienen que comprar una entrada. Cada entrada tiene un identificador como H32AZ123.

Escribe una función createVisitor que acepte tres argumentos.

  • El nombre del visitante.
  • La edad del visitante.
  • El identificador de la entrada que ha comprado el visitante.

La función debe devolver un objeto que contenga esta información. Las claves del objeto deben llamarse name, age y ticketId.

createVisitor('Verena Nardi', 45, 'H32AZ123');
// => { name: 'Verena Nardi', age: 45, ticketId: 'H32AZ123' }

2. Revoca la entrada

Cuando las personas salen del parque de atracciones, su entrada se revoca. Si vuelven, tienen que comprar una nueva. Para ahorrar tiempo a los visitantes habituales, solo tienen que registrarse una vez y la información del visitante se conserva para las visitas posteriores.

Eso significa que, cuando un visitante sale del parque, solo hay que invalidar su entrada, pero el resto del objeto del visitante debe permanecer igual. Implementa la función revokeTicket que acepte un objeto de visitante, establezca el identificador de la entrada a null y devuelva el objeto después.

const visitor = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
};

revokeTicket(visitor);
// => { name: 'Verena Nardi', age: 45, ticketId: null }

3. Determina el estado de la entrada

Para evitar la falsificación, los identificadores de las entradas son únicos. Una vez que se imprime una entrada, su identificador se añade como clave en un objeto del sistema para poder hacerle un seguimiento.

Antes de vender la entrada a un visitante, se almacena con el valor null en el objeto de seguimiento de entradas. Cuando se vende a un visitante, se asigna el nombre del visitante como valor. Cuando los empleados dudan de la validez de una entrada, tienen que consultar el estado de la entrada en el sistema.

Implementa una función ticketStatus que acepte el objeto de seguimiento y un identificador de entrada como argumentos. Debe devolver uno de los siguientes resultados.

  • 'unknown ticket id' si el identificador no se encontró en el objeto de seguimiento
  • 'not sold' en caso de que la entrada se imprimiera pero no se vendiera
  • 'sold to {name}' donde {name} es el nombre del visitante si la entrada se vendió
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

ticketStatus(tickets, 'RE90VAW7');
// => 'unknown ticket id'

ticketStatus(tickets, '0H2AZ123');
// => 'not sold'

ticketStatus(tickets, '23LA9T41');
// => 'sold to Verena Nardi'

4. Mejora la respuesta del estado de la entrada

Al cabo de un tiempo, los empleados te comentan que quieren que el estado de la entrada sea más fácil de entender a primera vista. Solo quieren ver el nombre del visitante o que la entrada no es válida.

Escribe una función simpleTicketStatus que acepte los mismos argumentos que ticketStatus en la tarea 3. Esta función solo devuelve uno de dos resultados diferentes.

  • el nombre del visitante si la entrada se vendió
  • 'invalid ticket !!!' si la entrada aún no se ha vendido o el identificador no se encontró en el objeto de seguimiento
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

simpleTicketStatus(tickets, '23LA9T41');
// => 'Verena Nardi'

simpleTicketStatus(tickets, '0H2AZ123');
// => 'invalid ticket !!!'

simpleTicketStatus(tickets, 'RE90VAW7');
// => 'invalid ticket !!!'

5. Determina la versión de los términos y condiciones

Debido a nuevos requisitos legales, los objetos de visitante recién creados ahora también contienen información detallada sobre los «Términos y condiciones generales» (GTC) que el usuario ha aceptado. A continuación puedes ver un ejemplo del nuevo objeto de visitante.

Los cajeros del parque de atracciones ahora tienen que comprobar si un visitante necesita firmar una nueva versión de los GTC. Para ello, implementa una función gtcVersion que acepte un objeto de visitante como argumento y devuelva la versión de los GTC si está disponible. Si la información de la versión no está disponible, no debe devolverse nada.

const visitorNew = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
  gtc: {
    signed: true,
    version: '2.1',
  },
};

gtcVersion(visitorNew);
// => '2.1'

const visitorOld = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
};

gtcVersion(visitorOld);
// => undefined
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
JavaScript Exercism

¿Listo para empezar Parque de atracciones?

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