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')