Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

178
Vistas
Cómo filtrar una matriz de objetos en la fecha

Tengo una serie de objetos que necesito filtrar y devolver solo los objetos más cercanos a la actualidad. El problema que tengo es que regresa la fecha de junio y no la de mayo. aquí está el código que estoy usando:

 const findClosest = (data, accessor, target = Date.now()) => data.reduce((prev, curr) => { const a = Math.abs(accessor(curr).getTime() - target); const b = Math.abs(accessor(prev).getTime() - target); return a - b < 0 ? curr : prev; }); const getClosestFromDate = (array, key, date) => { let arr = array.filter((e) => e[key] == date); return arr; }; const sampleData = [{ "max_retries_reached": 0, "next_charge_scheduled_at": "2022-06-23T00:00:00", }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-06-23T00:00:00", }, { "is_swappable": true, "max_retries_reached": 0, "next_charge_scheduled_at": "2022-06-23T00:00:00", }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-06-23T00:00:00", }, { "next_charge_scheduled_at": "2022-05-23T00:00:00", "order_day_of_month": null, }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-07-23T00:00:00", "order_day_of_month": null, }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-05-23T00:00:00", "order_day_of_month": null, }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-05-23T00:00:00", "order_day_of_month": null, }, { "next_charge_scheduled_at": "2022-07-23T00:00:00", "order_day_of_month": null, }, ]; const processDateString = (dateString) => { let date = new Date(dateString); let year = date.getFullYear(); let month = date.getMonth(); console.log(date.toString()); return new Date(year, month + 1, date); }; const closest = findClosest(sampleData, ({ next_charge_scheduled_at }) => processDateString(next_charge_scheduled_at), "2022-05-10T03:03:42"); console.log(closest.next_charge_scheduled_at); console.log(getClosestFromDate(sampleData, "next_charge_scheduled_at", closest.next_charge_scheduled_at));

Obtuve este código de una de las otras preguntas, pero por alguna razón, incluso después de intentar varias veces sumar o restar de la variable del mes, no puedo devolver la fecha correcta. Realmente agradecería ayuda en esto.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Te estabas haciendo la vida demasiado difícil:

(Revisé mi respuesta después de leer el último comentario de OP).

La const acc es una function(obj) que tomará la propiedad next_charge_scheduled_at del obj , la convertirá en un objeto de date y luego devolverá su valor .getTime() .

findClosest(sampleData,acc) devuelve un solo objeto de la matriz sampleData dada más cercana a la hora de destino ( Date.now() ). Luego almaceno el valor .getTime() de este elemento en la constante closest y lo uso nuevamente para filtrar a través de la matriz de entrada original:

 const sampleData = [{ "max_retries_reached": 0, "next_charge_scheduled_at": "2022-06-23T00:00:00", }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-06-23T00:00:00", }, { "is_swappable": true, "max_retries_reached": 0, "next_charge_scheduled_at": "2022-06-23T00:00:00", }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-06-23T00:00:00", }, { "next_charge_scheduled_at": "2022-05-23T00:00:00", "order_day_of_month": null, }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-07-23T00:00:00", "order_day_of_month": null, }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-05-23T00:00:00", "order_day_of_month": null, }, { "max_retries_reached": 0, "next_charge_scheduled_at": "2022-05-23T00:00:00", "order_day_of_month": null, }, { "next_charge_scheduled_at": "2022-07-23T00:00:00", "order_day_of_month": null, }, ]; const findClosest = (data, accessor, target = Date.now()) => data.reduce((prev, curr) => { const a = Math.abs(accessor(curr) - target); const b = Math.abs(accessor(prev) - target); return a - b < 0 ? curr : prev; }), acc=obj=>new Date(obj.next_charge_scheduled_at).getTime(), closest=acc(findClosest(sampleData,acc)); console.log(sampleData.filter(d=>acc(d)===closest));

La siguiente versión es aún más corta y evita el cálculo repetido de objetos de Date :

 function getClosest(arr){ const trg=Date.now() times=sampleData.map((d,i)=>[new Date(d.next_charge_scheduled_at).getTime(),i]), closest=times.reduce((p,c) => Math.abs(c[0]-trg) < Math.abs(p[0]-trg) ? c : p)[0]; return times.reduce((a,[t,i])=>(t==closest&&a.push(arr[i]),a),[]); }

getClosest() usa una matriz temporal times para almacenar el valor .getTime() calculado y el índice i para cada objeto. Después de encontrar el tiempo más cercano a Date.now() , la matriz de times es -reduce() d para compilar los resultados de la matriz de entrada original arr .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda