Si tengo una matriz como: let array = ["Friday, 11 February","Tuesday, 10 February","Friday, 04 March", "Thursday, 17 February", "Today", "Monday, 9 February"]; . Lo que trato de hacer es encontrar la fecha más cercana a hoy o la más pequeña y no quiero tomar "Hoy". Hasta ahora probé:
let array = ["Friday, 11 February","Tuesday, 10 February","Friday, 04 March", "Thursday, 17 February", "Today", "Monday, 9 February"]; array = array.map(el => el.split(", ").slice(1).join()).filter(el =>el) let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; let closest = ""; for(let i = 0; i < array.length; i++){ for(let j = 1; j < array.length; j++){ let numberOne = array[i].match(/\d+/)[0]; let monthOne = array[i].match(/\b[a-zA-Z]+\b/g)[0]; let numberTwo = array[j].match(/\d+/)[0]; let monthTwo = array[j].match(/\b[a-zA-Z]+\b/g)[0]; if(+(numberOne) < +(numberTwo) && months.indexOf(monthOne) <= months.indexOf(monthTwo)){ closest = array[i] } } } console.log(closest)Todo está bien, pero quiero saber si puedo transformarme en una Fecha y ordenar por fecha. ¿Alguien tiene una solución a esto o una forma más limpia de encontrar la fecha más cercana? La matriz es dinámica y hasta ahora no encontré ninguna fecha anterior a hoy y tomar esa. ¡Gracias!
En primer lugar, aquí hay un problema: el año no está definido, así que aclaremos que nos referimos al año actual al transformar todas las fechas en Fecha real:
const now = new Date(); array.map(el => new Date(`${el} ${now.getFullYear()}`);Entonces podemos calcular las diferencias a partir de ahora (en milisegundos):
array.map(el => new Date(`${el} ${now.getFullYear()}`) - now.getTime());Envolvámoslos en Math.abs para encontrar fácilmente cuál es el más pequeño usando Math.min() :
const offsets = array.map(el => Math.abs(new Date(`${el} ${now.getFullYear()}`) - now.getTime())); const closestIndex = offsets.findIndex(el => el === Math.min(...offsets)); closestIndex - índice de la fecha con el desplazamiento más pequeño que significa "más cercano a ahora".
Código completo (excluyendo "Hoy" desde el principio):
const array = ["Friday, 11 February", "Tuesday, 10 February", "Friday, 04 March", "Thursday, 17 February", "Today", "Monday, 9 February"].filter(el => el !== 'Today'); const now = new Date(); const offsets = array.map(el => Math.abs(new Date(`${el} ${now.getFullYear()}`) - now.getTime())); const closestIndex = offsets.findIndex(el => el === Math.min(...offsets)); console.log(array[closestIndex]);Pensé en la posibilidad de que algunas fechas pudieran ser el próximo año. El mejor ejemplo a fines de diciembre y principios de enero y escribo el siguiente código, que espero pueda ayudar a alguien.
let array = [ "Tuesday, 03 January", "Thursday, 05 January", "Thursday, 29 December", "Monday, 02 January", "Friday, 30 December" ]; let now = new Date(); var datesArray = array.map((el) => el + " " + now.getFullYear()); datesArray = datesArray.map((el) => new Date(el)); datesArray = datesArray.map(el => { if (el.getTime() < now.getTime()) { return el = el.setFullYear(el.getFullYear() + 1) }else{ return el = el.setFullYear(el.getFullYear()) } }) const closestIndex = datesArray.findIndex(el => el === Math.min(...datesArray)); console.log(array[closestIndex])