Quiero crear un sistema de filtrado para mi grilla en javascript. Mi problema es que tengo una cadena que contiene un número de años, meses y días. Me gustaría transformar esta cadena al formato de número de días. Es decir 1y1m2d = 1*365+1*30+2 , 1y2d = 1*365+2 u otra combinación como esta.
No estoy exactamente seguro de cómo manejar esto. Intenté crear una expresión regular para eso, sin embargo, no sé cómo distinguir si el grupo es por año o meses, etc.
Regex se ve así: /(\d+y)?(\d+m)?(\d+d)?/ sin embargo, con esta solución, el problema es que no puedo saber si el grupo es por años, meses etc.
La segunda solución que probé fue usar .replace y luego pasarlo a través math.eval() pero esto resultó no funcionar para mí, no estoy seguro de por qué.
let result = stringFormat.replace(/y|m|d/, function (x) { return x === 'y' ? '*365' : x === 'm' ? '*12' : '*30'; });¿Qué piensas sobre esto? ¿Cuál sería el mejor enfoque aquí?
Puedes usar
const stringFormat = '1y1m2d'; let result = stringFormat.replace(/[ymd]/g, function (x, index, source) { return (x === 'y' ? '*365' : x === 'm' ? '*30' : '')+(index !== source.length-1 ? '+' : ''); }); console.log(result) // => 1*365+1*30+2Notas:
/[ymd]/g coincide con todas las apariciones de y o m o d en la cadenax representa el valor de coincidencia, el index es la posición de inicio de coincidencia y la source es el valor de cadena de entraday , el reemplazo es *360 y + si la coincidencia no está al final de la cadena, si coincide m , el reemplazo es *30 y + , y si coincide d , no se agrega ningún multiplicador.(index !== source.length-1 ? '+' : '') comprueba si la coincidencia está al final de la cadena y añade + si es necesario. Funciona así porque la coincidencia siempre es un solo carácter.