/
distinct_by.ts
36 lines (32 loc) · 1.04 KB
/
distinct_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
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
// This module is browser compatible.
/**
* Returns all elements in the given array that produce a distinct value using
* the given selector, preserving order by first occurrence.
*
* @example
* ```ts
* import { distinctBy } from "https://deno.land/std@$STD_VERSION/collections/distinct_by.ts";
* import { assertEquals } from "https://deno.land/std@$STD_VERSION/testing/asserts.ts";
*
* const names = ["Anna", "Kim", "Arnold", "Kate"];
* const exampleNamesByFirstLetter = distinctBy(names, (it) => it.charAt(0));
*
* assertEquals(exampleNamesByFirstLetter, ["Anna", "Kim"]);
* ```
*/
export function distinctBy<T, D>(
array: readonly T[],
selector: (el: T) => D,
): T[] {
const selectedValues = new Set<D>();
const ret: T[] = [];
for (const element of array) {
const currentSelectedValue = selector(element);
if (!selectedValues.has(currentSelectedValue)) {
selectedValues.add(currentSelectedValue);
ret.push(element);
}
}
return ret;
}