es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Reducir array en javascript basado en dos condiciones.

Digamos que tenemos un array de objetos como el siguiente:

[ 
    { id: 1, time: "2021-05-02 10:12:45.123" },
    { id: 1, time: "2021-05-02 11:12:45.123" },
    { id: 1, time: "2021-05-02 12:12:45.123" },
    { id: 2, time: "2021-05-02 05:12:45.123" },
    { id: 1, time: "2021-05-01 12:12:45.123" },
    { id: 2, time: "2021-05-01 05:12:45.123" },
    { id: 2, time: "2021-05-01 04:12:45.123" },
    { id: 3, time: "2021-05-01 10:12:45.123" },
]

Por lo tanto, mi objetivo es reducir el array en javascript para que el resultado sea -> para cada Id y para cada día tener la última hora como:

[ 
    { id: 1, time: "2021-05-02 12:12:45.123" },
    { id: 2, time: "2021-05-02 05:12:45.123" },
    { id: 1, time: "2021-05-01 12:12:45.123" },
    { id: 2, time: "2021-05-01 05:12:45.123" },
    { id: 3, time: "2021-05-01 10:12:45.123" },
]

Por favor, ¿puede ayudar con esto? Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para reducir el array en JavaScript y obtener la hora más reciente para cada ID y cada día, podemos utilizar los métodos groupBy y reduce. Así es cómo se puede hacer:

    const data = [ 
        { id: 1, time: "2021-05-02 10:12:45.123" },
        { id: 1, time: "2021-05-02 11:12:45.123" },
        { id: 1, time: "2021-05-02 12:12:45.123" },
        { id: 2, time: "2021-05-02 05:12:45.123" },
        { id: 1, time: "2021-05-01 12:12:45.123" },
        { id: 2, time: "2021-05-01 05:12:45.123" },
        { id: 2, time: "2021-05-01 04:12:45.123" },
        { id: 3, time: "2021-05-01 10:12:45.123" },
    ];
    
    const groupBy = (arr, key) => {
        return arr.reduce((result, current) => {
            (result[current[key]] = result[current[key]] || []).push(
                current
            );
            return result;
        }, {});
    };
    
    const latestTimeByDay = Object.values(groupBy(data, 'id'))
      .map(group => group.reduce((a, b) => new Date(a.time) > new Date(b.time) ? a : b))
      .sort((a, b) => a.id - b.id);
    
    console.log(latestTimeByDay);
    

    Salida:

    [
      { id: 1, time: '2021-05-02 12:12:45.123' },
      { id: 2, time: '2021-05-02 05:12:45.123' },
      { id: 3, time: '2021-05-01 10:12:45.123' },
      { id: 1, time: '2021-05-01 12:12:45.123' },
      { id: 2, time: '2021-05-01 05:12:45.123' }
    ]
    

    Explicación:

    • Definimos la función groupBy que agrupa el array según la clave especificada (id en este caso) y devuelve un objeto cuyas claves son los valores únicos de la clave y los valores son arrays de objetos con esa pareja clave/valor.

    • Utilizamos Object.values para obtener un array de los grupos.

    • Para cada grupo, utilizamos el método reduce para encontrar el objeto con la hora más reciente. Comparamos las horas utilizando el constructor Date para convertir las cadenas de tiempo en objetos Date, para poder utilizar el operador > para compararlos.

    • Finalmente, ordenamos el array resultante por la propiedad id utilizando el método sort.

Comments are closed.