/
sort_by.ts
74 lines (69 loc) · 1.91 KB
/
sort_by.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
// This module is browser compatible.
/**
* Returns all elements in the given collection, sorted stably by their result using the given selector. The selector function is called only once for each element.
*
* Example:
*
* ```ts
* import { sortBy } from "https://deno.land/std@$STD_VERSION/collections/sort_by.ts"
* import { assertEquals } from "https://deno.land/std@$STD_VERSION/testing/asserts.ts";
*
* const people = [
* { name: 'Anna', age: 34 },
* { name: 'Kim', age: 42 },
* { name: 'John', age: 23 },
* ]
* const sortedByAge = sortBy(people, it => it.age)
*
* assertEquals(sortedByAge, [
* { name: 'John', age: 23 },
* { name: 'Anna', age: 34 },
* { name: 'Kim', age: 42 },
* ])
* ```
*/
export function sortBy<T>(
array: readonly T[],
selector: (el: T) => number,
): T[];
export function sortBy<T>(
array: readonly T[],
selector: (el: T) => string,
): T[];
export function sortBy<T>(
array: readonly T[],
selector: (el: T) => bigint,
): T[];
export function sortBy<T>(
array: readonly T[],
selector: (el: T) => Date,
): T[];
export function sortBy<T>(
array: readonly T[],
selector:
| ((el: T) => number)
| ((el: T) => string)
| ((el: T) => bigint)
| ((el: T) => Date),
): T[] {
const len = array.length;
const indexes = new Array<number>(len);
const selectors = new Array<ReturnType<typeof selector> | null>(len);
for (let i = 0; i < len; i++) {
indexes[i] = i;
const s = selector(array[i]);
selectors[i] = Number.isNaN(s) ? null : s;
}
indexes.sort((ai, bi) => {
const a = selectors[ai];
const b = selectors[bi];
if (a === null) return 1;
if (b === null) return -1;
return a > b ? 1 : a < b ? -1 : 0;
});
for (let i = 0; i < len; i++) {
(indexes as unknown as T[])[i] = array[indexes[i]];
}
return indexes as unknown as T[];
}