const getValueFromAnyKey = (obj: any, keys: string[]): any => { let value = obj; for (const key of keys) { if (value && key in value) { value = value[key]; } else { return undefined; } } return value; }; type Sort = (arr: any[], k: string | string[], order?: "asc" | "desc") => any[]; const sort: Sort = (arr, k, order = "asc") => { const keys = Array.isArray(k) ? k : [k]; const shouldReverse = order !== "asc"; const result = [...arr]; const getComparator = () => { const sampleValue = getValueFromAnyKey(result[0], keys); if (typeof sampleValue === "number") { return (a: any, b: any) => { const aN = getValueFromAnyKey(a, keys); const bN = getValueFromAnyKey(b, keys); if (aN == null) return bN == null ? 0 : 1; if (bN == null) return -1; return (aN as number) - (bN as number); }; } if (typeof sampleValue === "string") { return (a: any, b: any) => { const aN = getValueFromAnyKey(a, keys); const bN = getValueFromAnyKey(b, keys); if (aN == null) return bN == null ? 0 : 1; if (bN == null) return -1; return (aN as string).localeCompare(bN as string); }; } if (sampleValue instanceof Date) { return (a: any, b: any) => { const aN = getValueFromAnyKey(a, keys); const bN = getValueFromAnyKey(b, keys); if (aN == null) return bN == null ? 0 : 1; if (bN == null) return -1; return (aN as Date).getTime() - (bN as Date).getTime(); }; } throw new TypeError(`Unsupported data type for key "${k}"`); }; const comparator = getComparator(); result.sort((a, b) => { const comparison = comparator(a, b); return shouldReverse ? -comparison : comparison; }); return result; }; export default sort;