Tracks
/
JavaScript
JavaScript
/
Ejercicios
/
Maestro de lasañas
Maestro de lasañas

Maestro de lasañas

Ejercicio de aprendizaje

Introducción

Una función es un bloque de código organizado y reutilizable que se usa para realizar alguna acción. Hay varias maneras de definir funciones en JavaScript. Aquí veremos las declaraciones de función y las expresiones de función. Otras posibilidades, como las funciones flecha, se cubrirán en otros conceptos.

Declaración de función

La forma estándar de definir una función en JavaScript es una declaración de función, también llamada definición de función o sentencia de función.

Consiste en la palabra clave function, el nombre de la función y una lista de parámetros separados por comas entre paréntesis. A esto le sigue el cuerpo de la función (el conjunto de sentencias que define qué hace una función), encerrado entre llaves.

function someName(param1, param2, param3) {
  // ...
}

En JavaScript, una función se invoca (se llama) escribiendo el nombre de la función seguido de paréntesis que contienen los argumentos.

someName(arg1, arg2, arg3);

Parámetros

Cuando trabajas con parámetros dentro del cuerpo de la función, ten en cuenta los posibles efectos secundarios.

  • Los valores de los tipos de datos primitivos son inmutables. El valor original nunca se ve afectado por lo que le ocurra al argumento dentro del cuerpo de la función.
  • Para todos los demás valores (objetos, arrays, funciones), una reasignación no afectará el valor original. Sin embargo, si modificas ese argumento (por ejemplo, si agregas una clave a un objeto), también modificas el valor original que se pasó.

De forma predeterminada, todos los parámetros definidos en la declaración de la función son opcionales en JavaScript. Si proporcionas menos argumentos que parámetros hay, los argumentos faltantes serán undefined dentro de la función; consulta Null y Undefined. En muchos casos tiene sentido asignar un valor predeterminado más apropiado que undefined. Esto se puede hacer especificando parámetros predeterminados directamente en la definición de la función.

function someName(param1 = defaultValue1, param2 = defaultValue2) {
  // ...
}

Sentencia return

Una sentencia return termina la ejecución de la función y especifica un valor que se devolverá a quien llamó a la función. Una función puede tener varias sentencias return.

function checkNumber(num) {
  if (num === 0) {
    return 'You passed 0, please provide another number.';
  }

  return 'Thanks for passing such a nice number.';
}

El valor que devuelve una función se puede guardar en una variable.

function sum(x, y) {
  return x + y;
}

const total = sum(5, 10);
// => 15

El resultado de una función que no devuelve ningún valor o que no tiene una sentencia return es undefined. En JavaScript no hay return implícitos.

function nakedReturn(a) {
  a * 2;
  return;
}

nakedReturn(1);
// => undefined

function noReturn(a) {
  a * 2;
}

noReturn(1);
// => undefined

En JavaScript solo puedes devolver exactamente un valor. Si quieres pasar más información, primero debes combinarla en una sola entidad, por lo general en un objeto o un array.

function divide(a, b) {
  return {
    quotient: Math.floor(a / b),
    remainder: a % b,
  };
}

Expresión de función

Una declaración de función es una sentencia independiente. Pero a veces es útil definir una función como parte de otra expresión, por ejemplo, en una asignación, como parámetro de una función (callback) o como valor en un objeto. Esto se puede hacer con una expresión de función. Tiene la misma sintaxis que una declaración de función, solo que se puede omitir el nombre de la función para crear una función anónima.

const someFunction = function (param) {
  // ...
};

someOtherFunction(function (param) {
  // ...
});

const obj = {
  someFunction: function (param) {
    // ...
  },
};

Instrucciones

En este ejercicio vas a escribir un poco más de código relacionado con preparar y cocinar tu brillante lasaña de tu libro de cocina favorito.

Tienes cinco tareas. La primera está relacionada con la cocción en sí, y las otras cuatro con la preparación perfecta.

1. Determina si la lasaña está lista

Cuando tienes una lasaña en el horno, quieres saber si ya puedes sacarla o no. Para asegurarte de que la lasaña no se queme en el horno, normalmente pones un temporizador. Pero a veces se te olvida.

Escribe una función cookingStatus que acepte como parámetro el tiempo restante del temporizador en minutos. La función tiene tres resultados posibles.

  • Si el temporizador muestra 0, debe devolver 'Lasagna is done.'.
  • Si el temporizador muestra cualquier otro número, el resultado debe ser 'Not done, please wait.'.
  • Si se llama a la función sin un valor de temporizador, el resultado debe ser 'You forgot to set the timer.'.

El temporizador nunca mostrará un valor menor que 0.

cookingStatus(12);
// => 'Not done, please wait.'

cookingStatus();
// => 'You forgot to set the timer.'

2. Calcula el tiempo de preparación

Para la próxima lasaña que prepares, quieres asegurarte de reservar suficiente tiempo para poder disfrutar de la cocción. Ya hiciste un plan con todas las capas que tendrá tu lasaña. Ahora quieres calcular cuánto tardará la preparación a partir de eso.

Implementa una función preparationTime que acepte un array de capas y el tiempo promedio de preparación por capa en minutos. La función debe devolver la estimación del tiempo total de preparación según el número de capas. Si se llama a la función sin proporcionar el tiempo promedio de preparación, se deben asumir 2 minutos en su lugar.

const layers = ['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles'];
preparationTime(layers, 3);
// => 18

preparationTime(layers);
// => 12

3. Calcula las cantidades necesarias de fideos y salsa

Además de reservar el tiempo, también quieres asegurarte de tener suficiente salsa y fideos para cocinar la lasaña de tus sueños. Por cada capa de fideos en tu lasaña, necesitarás 50 gramos de fideos. Por cada capa de salsa en tu lasaña, necesitarás 0.2 litros de salsa.

Define la función quantities que toma un array de capas como parámetro. La función determinará entonces la cantidad de fideos y salsa necesaria para preparar tu comida. El resultado debe devolverse como un objeto con las claves noodles y sauce.

quantities(['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles']);
// => { noodles: 100, sauce: 0.4 }

4. Agrega el ingrediente secreto

Hace un tiempo visitaste a un amigo y comiste lasaña en su casa. Estaba increíble y tenía algo especial. Tu amigo te envió la lista de ingredientes y te dijo que el último elemento de la lista es el «ingrediente secreto» que hizo que la comida fuera tan especial. Ahora quieres agregar ese ingrediente secreto también a tu receta.

Escribe una función addSecretIngredient que acepte dos arrays de ingredientes como parámetros. El primer parámetro es la lista que te envió tu amigo y el segundo es la lista de ingredientes de tu propia receta. La función debe agregar el último elemento de la lista de tu amigo al final de tu lista. El array que representa tu receta debe modificarse directamente y la función no debe devolver nada. Sin embargo, el primer argumento no debe modificarse.

const friendsList = ['noodles', 'sauce', 'mozzarella', 'kampot pepper'];
const myList = ['noodles', 'meat', 'sauce', 'mozzarella'];

addSecretIngredient(friendsList, myList);
// => undefined

console.log(myList);
// => ['noodles', 'meat', 'sauce', 'mozzarella', 'kampot pepper']

5. Escala la receta

Las cantidades que aparecen en tu libro de cocina solo alcanzan para dos porciones de lasaña. Como la próxima vez quieres cocinar para más personas, quieres calcular las cantidades para distintos números de porciones.

Implementa una función scaleRecipe que tome dos parámetros.

  • Un objeto de receta que contiene las cantidades necesarias para 2 porciones. El formato del objeto se puede ver en el ejemplo de abajo.
  • El número de porciones que quieres cocinar.

La función debe devolver un objeto de receta con las cantidades necesarias para el número de porciones deseado. Pero quieres conservar la receta original. Esto significa que, en esta tarea, el argumento de la receta no debe modificarse.

const recipe = {
  noodles: 200,
  sauce: 0.5,
  mozzarella: 1,
  meat: 100,
};

scaleRecipe(recipe, 4);
// =>
// {
//   noodles: 400,
//   sauce: 1,
//   mozzarella: 2,
//   meat: 200,
// };

console.log(recipe);
// =>
// {
//   noodles: 200,
//   sauce: 0.5,
//   mozzarella: 1,
//   meat: 100,
// };
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
JavaScript Exercism

¿Todo listo para empezar Maestro de lasañas?

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