Búsqueda de sitios web

javascript - Calcular minutos a partir de una cadena de minutos y horas


Tengo una función que toma una cadena de horas y minutos y la convierte en minutos. Esto funciona absolutamente bien, pero ¿qué pasa si el argumento recibido es solo de minutos o solo de horas? Por ejemplo

const str = "1 hour 5 mins"; // works
const str = "1 hour"; // doesn't work
const str = "5 mins"; //  doesn't work

const str = "1 hour 5 mins";
this.calculate(str);
calculate(str) {
    let res = str.match(/\d+/g).map(Number);
    return res[0] * 60 + res[1]
}

Respuesta #1

Necesitas una expresión regular más inteligente que sea capaz de distinguir entre los valores de hora y minuto:

const calculate = (s) => {
  const matches = /(?:(\d+) hours?)? ?(?:(\d+) mins?)?/.exec(s);
  
  return Number(matches[1] || 0) * 60 + Number(matches[2] || 0);
};

console.log(calculate('1 hour 5 mins')); // 65
console.log(calculate('2 hours 1 min')); // 121
console.log(calculate('3 hours')); // 180
console.log(calculate('10 mins')); // 10

Respuesta #2

Puedes verificar que si tu cadena contiene hour, entonces el primer valor necesita multiplicarse por 60, de lo contrario debería usarse el mismo valor.

Y (res[0] || 0) esta parte devolverá el valor 0 cuando res[0] sea null o undefined.

function calculate(str) {
  let multiplier = str.includes("hour") ? 60 : 1;
  let res = str.match(/\d+/g).map(Number);
  return (res[0] || 0) * multiplier + (res[1] || 0);
}

console.log(this.calculate("1 hour 5 mins"));
console.log(this.calculate("1 hour"));
console.log(this.calculate("5 mins"));
console.log(this.calculate("2 hours 5 mins"));