Tengo una serie de marcas de tiempo o cadenas que tienen este formato: día-mes-año. por ejemplo ['03-11-2018', '04-12-2018', '10-01-2017', '10-12-2017']
Y quiero ordenarlos cronológicamente para que la matriz anterior se convierta en [ '10-01-2017', '10-12-2017', '03-11-2018', '04-12-2018' ]
Soy consciente de que puede usar moment.js para hacer esto, pero quiero escribir esto a mano sin usar ninguna tercera biblioteca.
Aquí está mi intento:
function sortTimestamp(array) { array.sort((time1, time2) => { const [day1, month1, year1] = time1.split('-') const [day2, month2, year2] = time2.split('-') return year2 > year1 ? -1 : year2 < year1 ? 1 : month2 > month1 ? -1 : month2 > month1 ? 1 : day2 > day1 ? -1 : 1 }) }Funciona bien, pero no es realmente legible y es un enfoque muy imperativo. Me pregunto si hay una mejor manera de hacerlo y también, idealmente, se puede ampliar para admitir otros formatos de fecha, por ejemplo, mes-día-año.
Una alternativa es especificar con argumentos adicionales cuál es el formato (regex) y cómo se debe reordenar al formato AAAAMMDD de estilo ISO. Luego, la función puede realizar ese reemplazo y hacer una clasificación léxica:
function sortTime(array, regex, iso) { let fmt = time => time.replace(regex, iso); return array.sort((time1, time2) => fmt(time1).localeCompare(fmt(time2))); } // demo let dates = ['03-11-2018', '04-12-2018', '10-01-2017', '10-12-2017']; let result = sortTime(dates, /(..)-(..)-(....)/, "$3$2$1"); console.log(result);Entonces, si la entrada debe interpretarse como mm-dd-yyyy en lugar de dd-mm-yyyy, haga que el tercer argumento sea "$3$1$2" en lugar de "$3$2$1".
Es un poco más simple usando restas en lugar de ternarios anidados.
function sortTimestamp(array) { array.sort((time1, time2) => { const [day1, month1, year1] = time1.split('-') const [day2, month2, year2] = time2.split('-') return year1 - year2 || month1 - month2 || day1 - day2; }) }Primero puede convertirlos en objetos de fecha y luego usar la funcionalidad getTime para compararlos y clasificarlos. Una pregunta similar fue respondidaaquí
const dates = ['03-11-2018', '04-12-2018', '10-01-2017', '10-21-2017'] sortedDates = dates.sort((a,b)=>{ const dateA = new Date(a) const dateB = new Date(b) //change the comparison sign for required orde return dateA.getTime() < dateB.getTime() ? 1 : -1 }) console.log(sortedDates)