const getValueFromAnyKey = (obj: any, keys: string[]): any => { let value = obj; for (let i = 0; i < keys.length; i++) { if (value && keys[i] in value) { value = value[keys[i]]; } else { break; } } return value; }; type Sort = (arr: any[], k: string | string[], order?: "asc" | "desc") => any[]; const sort: Sort = (arr, k, order = "asc") => { return arr.sort((a, b) => { let aN = a; let bN = b; if (Array.isArray(k)) { aN = getValueFromAnyKey(a, k); bN = getValueFromAnyKey(b, k); } else { aN = a[k]; bN = b[k]; } let c = 0; if (typeof aN === "number" && typeof bN === "number") { c = aN - bN; } else if (typeof aN === "string" && typeof bN === "string") { c = aN.localeCompare(bN); } else if (aN instanceof Date && bN instanceof Date) { c = aN.getTime() - bN.getTime(); } else { throw new TypeError(`Unsupported data type for key "${k}"`); } return order === "asc" ? c : -c; }); }; export default sort;