40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
/**
|
|
* Sortiert ein Array von Objekten anhand einer Spalte.
|
|
*
|
|
* @param data Array von Objekten
|
|
* @param column Sortierspalte (Property-Name im Objekt)
|
|
* @param ascending true = aufsteigend, false = absteigend
|
|
*/
|
|
export function sortData<T extends Record<string, any>>(
|
|
data: T[],
|
|
column?: keyof T | null,
|
|
ascending: boolean = true
|
|
): T[] {
|
|
if (!column) return data
|
|
|
|
return [...data].sort((a, b) => {
|
|
const valA = a[column]
|
|
const valB = b[column]
|
|
|
|
// null/undefined nach hinten
|
|
if (valA == null && valB != null) return 1
|
|
if (valB == null && valA != null) return -1
|
|
if (valA == null && valB == null) return 0
|
|
|
|
// Zahlenvergleich
|
|
if (typeof valA === "number" && typeof valB === "number") {
|
|
return ascending ? valA - valB : valB - valA
|
|
}
|
|
|
|
// Datumsvergleich
|
|
// @ts-ignore
|
|
if (valA instanceof Date && valB instanceof Date) {
|
|
return ascending ? valA.getTime() - valB.getTime() : valB.getTime() - valA.getTime()
|
|
}
|
|
|
|
// Fallback: Stringvergleich
|
|
return ascending
|
|
? String(valA).localeCompare(String(valB))
|
|
: String(valB).localeCompare(String(valA))
|
|
})
|
|
} |