Solución
solution.tsTypeScript
export function groupBy<T extends Record<string, unknown>>(
items: T[],
key: keyof T
): Record<string, T[]> {
// Agrupa los elementos por el valor de la propiedad indicada
return items.reduce( (groupedObj, subObj) => {
// Crea la propiedad (llave) de agrupamiento de los obj item
const groupingKey = subObj[key] as string;
// Comprueba si existe la dicha llave en objeto de agrupamiento final
if( groupedObj.hasOwnProperty( groupingKey )) {
// Si existe simplemente se añade el subObj al array de values
// la llave de agrupamiento es creada desde el subObj =>
// no necesita mayor comprobación
groupedObj[groupingKey].push( subObj);
} else {
// Si aún no ha sido creada dicha prop
// la creamos con un array vacío
groupedObj[groupingKey] = []
// agregamos el subObj. A NOTAR que el método push()
// devuelve la nueva longitud y lo que tenemos es un subObj[]: T[]
// de ahí los pasos
groupedObj[groupingKey].push(subObj)
}
return groupedObj;
}, {});
}0respuestas