domingo, 14 de agosto de 2022

📦 Agrupador de elementos

Un agrupador de elementos retorna un diccionario, donde la llave es el identificador para poder acceder al conjunto de valores que cumplan su misma condición.

Problemática

Dada una lista de elementos queremos tener agrupado por medio de las fechas los productos vendidos en un mismo día.

type Sale = {    producto: string    ingreso: string    cantidad: number}const sales: Sale[] = [    { producto: "Televisor", ingreso: "12/12/2020", cantidad: 100 },    { producto: "Celular", ingreso: "12/12/2020", cantidad: 50 },    { producto: "Celular", ingreso: "13/12/2020", cantidad: 20 },    { producto: "Celular", ingreso: "14/12/2020", cantidad: 35 },]

Solución

Una de las muchas posibles soluciones, sería agrupar los elementos por medio de un diccionario, donde la llave sea la fecha y su contenido sea un listado de los productos vendidos.

type Group<T> = { [key: string]: T[] }function groupBy<T extends any[]>(matriz: T, param: keyof T[0]): Group<T> {    const group: Group<T> = {}    for (let item of matriz) {        if (item[param] in group) {            group[item[param]].push(item)        } else {            group[item[param]] = [item]        }    }    return group}

La función groupBy recibe como parametro una matriz de elementos y el nombre del parámetro que servirá como llave.

La const group = {} inicializa el diccionario siendo este vacío.

Seguidamente el primer ciclo FOR permite agregar conjunto de elementos vacios teniendo como llave el parametro param.

{ '12/05/22' : [] }

El segundo ciclo FOR se encarga de agregar los elementos dependiendo de su mismo conjunto.

{ '12/05/22' : [    { producto: "Televisor", ingreso: "12/12/2020", cantidad: 100 },    { producto: "Televisor", ingreso: "12/12/2020", cantidad: 100 },] }

Uso

Intenta probarlo con tu runtime de typescript preferido o visita Typescript Playground

const salesByDate = groupBy(sales, 'ingreso')
Desarrollado con Nuxt 3 💚
Erik Ciau Apple Emoji To Love