type IterableKind<T> = Iterable<T> | T[];
export function ensureArray<T>(data?: IterableKind<T>): T[] {
if (!data) return [];
if (Array.isArray(data)) return data;
if (typeof data === "string") return [data];
if (data instanceof Map) return [];
return Array.from(data);
}
export function firstItem<T>(data?: IterableKind<T>): T | undefined {
return ensureArray(data)[0];
};
export function arraySum<T>(arr: IterableKind<T>, fn: (arg: T) => number): number {
return ensureArray(arr).reduce((p, c) => p + fn(c), 0);
}
export function arrayMin<T>(arr: IterableKind<T>, fn: (arg: T) => number): number | undefined {
const values = ensureArray(arr).map(fn);
return values.length ? Math.min.apply(Math, values) : undefined;
}
export function arrayMax<T>(arr: IterableKind<T>, fn: (arg: T) => number): number | undefined {
const values = ensureArray(arr).map(fn);
return values.length ? Math.max.apply(Math, values) : undefined;
}
export function createMap<TSource, TKey, TValue>(items: Iterable<TSource>, keySelector: (x: TSource) => TKey, valueSelector: (x: TSource) => TValue): Map<TKey, TValue> {
const m = new Map<TKey, TValue>();
for (const item of items) {
const key = keySelector(item);
const value = valueSelector(item);
m.set(key, value);
}
return m;
}
export function distinctBy<T, K>(array: IterableKind<T>, keySelector: (item: T) => K): T[] {
const seen = new Map<K, T>();
for (const item of array) {
const key = keySelector(item);
if (!seen.has(key)) {
seen.set(key, item);
}
}
return Array.from(seen.values());
}946300cookie-checkTypescript Array / Iterable Helpers