Estoy tratando de enseñarme a mí mismo acerca de los operadores ternarios, y estoy atrapado en un problema. Para explicar mejor lo que estoy tratando de hacer, a continuación hay un seudocódigo de cómo quiero que se vea mi código:

const regex = /\d+k\d+/;
const input = "8k4";

const response = (!regex.test(input) ? "Regex does not match." : (
  const roll = input.substring(0);
  const keep = input.substring(2);
  (parseInt(roll) >= parseInt(keep) ? "Correct Format!" : "Keep is greater than Roll." )
);

console.log(response);

En esencia, estoy tratando de replicar algo como el siguiente código if / else pero usando operadores ternarios (para condensar mi código), y parece que no puedo encontrar el formato correcto para declarar los bits const en el segundo condición de la operación ternaria:

const response = function() {
    if(!regex.test(input)) {
    return "Regex does not match.";
  } else {
    const roll = input.substring(0);
    const keep = input.substring(2);
    if(parseInt(roll) >= parseInt(keep)) {
      return "Correct Format!";
    } else {
      return "Keep is greater than Roll."
    }
  }
}();

Por contexto, estoy construyendo un Discord Bot que tira los dados usando discord.js, así que mis amigos y yo no necesitamos estar juntos para jugar juegos de mesa en el mismo lugar, de ahí las variables "rodar" y "mantener".

2
James Whiteley 8 sep. 2018 a las 22:39

4 respuestas

La mejor respuesta

No puede tener declaraciones de variables dentro de otra declaración de variables, aparte de eso, su pseudocódigo funciona:

const regex = /\d+k\d+/;
const input = "8k4";

const response = (!regex.test(input) ? "Regex does not match." : (
  parseInt(input.substring(0)) >= parseInt(input.substring(2)) ?
  "Correct Format!" : "Keep is greater than Roll." )
)

console.log(response)
2
Luca Kiebel 8 sep. 2018 a las 19:47

Puede usar una función auxiliar para comparar valores y distribuir los valores divididos a la función

const
    regex = /\d+k\d+/,
    input = "8k4",
    compare = (a, b) => +a >= +b,
    response = !regex.test(input)
        ? "Regex does not match."
        : compare(...input.split('k'))
            ? "Correct Format!"
            : "Keep is greater than Roll.";

console.log(response);
3
Nina Scholz 8 sep. 2018 a las 20:07

No creo que pueda tener expresiones multilínea en la última parte de su declaración ternaria (después de :), podría intentar poner eso en una función y llamarlo desde el ternario más externo.

0
johnheroy 8 sep. 2018 a las 19:47

Esta respuesta se desarrolla en la respuesta de Luca anterior. Pero elimina aún más los paréntesis no obligatorios y utiliza unary plus operator para convertir una cadena en un entero.

const response = regex.test(input)
? +input.substring(0) >= +input.substring(2) ? 'Correct Format!' : 'Keep is greater than Roll.'
: 'Regex does not match.'
0
rmn 8 sep. 2018 a las 21:34