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')); // 10Respuesta #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"));