diff --git a/src/ts/common/interfaces.ts b/src/ts/common/interfaces.ts index 068feed..5e00b85 100644 --- a/src/ts/common/interfaces.ts +++ b/src/ts/common/interfaces.ts @@ -1870,3 +1870,5 @@ if (typeof window !== 'undefined') { const nodeLoadTime = getNanoSeconds() - process.uptime() * 1e9; counterNow = () => (getNanoSeconds() - nodeLoadTime) / 1e6; } + +export type PrimitiveValues = string | number | symbol | boolean; diff --git a/src/ts/common/utils.ts b/src/ts/common/utils.ts index 5a9fce8..c69d478 100644 --- a/src/ts/common/utils.ts +++ b/src/ts/common/utils.ts @@ -1,6 +1,6 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Observable } from 'rxjs'; -import { Point, Rect, Entity, Dict, Holiday, Season } from './interfaces'; +import { Point, Rect, Entity, Dict, Holiday, Season, PrimitiveValues } from './interfaces'; import { tileWidth, tileHeight, SECOND, MINUTE, HOUR, DAY } from './constants'; import { ACCESS_ERROR, NOT_FOUND_ERROR, OFFLINE_ERROR, PROTECTION_ERROR } from './errors'; @@ -562,3 +562,13 @@ export function getY(e: AnyEvent): number { export function isKeyEventInvalid(e: KeyboardEvent) { return e.target && /^(input|textarea|select)$/i.test((e.target).tagName); } + +export function uniqById(array: T[], uniqueKey: (self: T) => PrimitiveValues) { + const seen = new Set(); + return array.filter(item => { + const id = uniqueKey(item); + const isDuplicate = seen.has(id); + seen.add(id); + return !isDuplicate; + }); +}