1*082815dcSEvan Baconexport function sortObject<T extends Record<string, any> = Record<string, any>>(
2*082815dcSEvan Bacon  obj: T,
3*082815dcSEvan Bacon  compareFn?: (a: string, b: string) => number
4*082815dcSEvan Bacon): T {
5*082815dcSEvan Bacon  return Object.keys(obj)
6*082815dcSEvan Bacon    .sort(compareFn)
7*082815dcSEvan Bacon    .reduce(
8*082815dcSEvan Bacon      (acc, key) => ({
9*082815dcSEvan Bacon        ...acc,
10*082815dcSEvan Bacon        [key]: obj[key],
11*082815dcSEvan Bacon      }),
12*082815dcSEvan Bacon      {}
13*082815dcSEvan Bacon    ) as T;
14*082815dcSEvan Bacon}
15*082815dcSEvan Bacon
16*082815dcSEvan Baconexport function sortObjWithOrder<T extends Record<string, any> = Record<string, any>>(
17*082815dcSEvan Bacon  obj: T,
18*082815dcSEvan Bacon  order: string[]
19*082815dcSEvan Bacon): T {
20*082815dcSEvan Bacon  const sorted = sortWithOrder(Object.keys(obj), order);
21*082815dcSEvan Bacon
22*082815dcSEvan Bacon  return sorted.reduce(
23*082815dcSEvan Bacon    (acc, key) => ({
24*082815dcSEvan Bacon      ...acc,
25*082815dcSEvan Bacon      [key]: obj[key],
26*082815dcSEvan Bacon    }),
27*082815dcSEvan Bacon    {}
28*082815dcSEvan Bacon  ) as T;
29*082815dcSEvan Bacon}
30*082815dcSEvan Bacon
31*082815dcSEvan Baconexport function sortWithOrder(obj: string[], order: string[]): string[] {
32*082815dcSEvan Bacon  const groupOrder = [...new Set(order.concat(obj))];
33*082815dcSEvan Bacon  const sorted: string[] = [];
34*082815dcSEvan Bacon
35*082815dcSEvan Bacon  while (groupOrder.length) {
36*082815dcSEvan Bacon    const key = groupOrder.shift()!;
37*082815dcSEvan Bacon    const index = obj.indexOf(key);
38*082815dcSEvan Bacon    if (index > -1) {
39*082815dcSEvan Bacon      const [item] = obj.splice(index, 1);
40*082815dcSEvan Bacon      sorted.push(item);
41*082815dcSEvan Bacon    }
42*082815dcSEvan Bacon  }
43*082815dcSEvan Bacon
44*082815dcSEvan Bacon  return sorted;
45*082815dcSEvan Bacon}
46*082815dcSEvan Bacon
47*082815dcSEvan Baconexport const reverseSortString = (a: string, b: string) => {
48*082815dcSEvan Bacon  if (a < b) return 1;
49*082815dcSEvan Bacon  if (a > b) return -1;
50*082815dcSEvan Bacon  return 0;
51*082815dcSEvan Bacon};
52