Rutas
/
JavaScript
JavaScript
/
Ejercicios
/
Maestro de la lasaña
Maestro de la lasaña

Maestro de la lasaña

Ejercicio de aprendizaje

Introducción

Una función es un bloque de código organizado y reutilizable que se utiliza para realizar alguna acción. Hay varias formas 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 tratará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 instrucción de función.

Consta de la palabra clave function, el nombre de la función y una lista de parámetros separados por comas entre paréntesis. A continuación viene el cuerpo de la función (el conjunto de instrucciones que define lo que hace la 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 un paréntesis que contiene los argumentos.

someName(arg1, arg2, arg3);

Parámetros

Cuando trabajes 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.
  • En el caso del resto de valores (objetos, arrays, funciones), una reasignación no afectará al valor original. Sin embargo, si modificas ese argumento (por ejemplo, si añades una clave a un objeto), también modificarás el valor original que se pasó.

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

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

Instrucción return

Una instrucción return termina la ejecución de la función y especifica un valor que se devuelve a quien llamó a la función. Una función puede tener varias instrucciones 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 devuelto por una función se puede almacenar 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 con return o que no tiene una instrucción 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 tienes que combinarla en una sola entidad, normalmente 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 instrucción independiente. Pero a veces resulta ú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 de un objeto. Esto puede hacerse 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 algo más de código relacionado con la preparación y el cocinado de tu magnífica lasaña de tu libro de cocina favorito.

Tienes cinco tareas. La primera está relacionada con el cocinado 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 inferior a 0.

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

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

2. Estima el tiempo de preparación

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

Implementa una función preparationTime que acepte un array de capas y el tiempo medio de preparación por capa en minutos. La función debe devolver la estimación del tiempo total de preparación a partir del número de capas. Si se llama a la función sin proporcionar el tiempo medio de preparación, se debe 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 de tu lasaña, necesitarás 50 gramos de fideos. Por cada capa de salsa de tu lasaña, necesitarás 0,2 litros de salsa.

Define la función quantities, que toma un array de capas como parámetro. A continuación, la función determinará la cantidad de fideos y salsa necesarios 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. Añade 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. El 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 añadir 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 el array que te envió tu amigo y el segundo es el array de ingredientes de tu propia receta. La función debe añadir el último elemento del array de tu amigo al final de tu array. 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 dan para una lasaña de dos raciones. Como la próxima vez quieres cocinar para más gente, quieres calcular las cantidades para distintos números de raciones.

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

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

La función debe devolver un objeto de receta con las cantidades necesarias para el número de raciones deseado. No obstante, 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 pestaña nueva
JavaScript Exercism

¿Listo para empezar Maestro de la lasaña?

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