misc-utils-of-mine-generic
Version:
Miscellaneous utilities for JavaScript/TypeScript that I often use
93 lines (87 loc) • 2.3 kB
text/typescript
/**
* List given enum keys as array. Must be used on enums with declared values (enum E {a='a', b='b'}, if not
* values could be also returned . For enums without declared values, use enumNoValueKeys
*/
export function enumKeys(anEnum: any): string[] {
const a = []
for (let i in anEnum) {
a.push(i)
}
return a
}
/**
* List given enum keys as array. Differently to [[enumKeys]], is should be used only on enums that doesn't
* have assigned values or other wise on those which values are identical to the keys or not strings. If not,
* they will be returned also!
*/
export function enumNoValueKeys(anEnum: any): string[] {
return Object.keys(anEnum)
.map(i => anEnum[i as any])
.filter((s, i, a) => typeof s === 'string' && a.indexOf(s) === i)
}
/**
* Returns the key of the first property with given value of given enum
*/
export function getEnumKey(anEnum: any, value: any): string {
for (const key in anEnum) {
if (value === anEnum[key]) {
return key
}
}
return ''
}
/**
* Return given enum as a {name, value} array.
*/
export function getEnumKeyAndValue(e: any) {
const a = []
for (const key in e) {
a.push({ key, value: e[key] })
}
return a
}
/**
* return the Enum type from given string enum key obtained with key [[enumNoValueKeys]]
*/
export function enumValueFromString<T>(key: string, anEnum: any): T | undefined {
return anEnum[key]
}
/** Optimal array to dictionary de serialization because `array.reduce` and `Object.assign` are too slow for large collections. */
export function toObject<T = any>(array: T[], groupByKey: string) {
const obj: { [s: string]: T } = {};
array.forEach(item => {
//@ts-ignore
obj[item[groupByKey]] = item;
})
return obj;
}
/**
* From an enum like :
* ```
enum Providers {
apple = 1,
google = 2,
facebook = 3,
}
* ```
builds an object like this:
* ```
{
apple: 1,
google: 2,
facebook: 3
}
* ```
useful for in-code documentation/descriptions/validations
*/
export function buildEnumMap(anEnum: any) {
const r = {} as any
getEnumKeyAndValue(anEnum).forEach(({ key, value }) => {
if (isNaN(parseInt(key))) {
r[key.toLowerCase()] = value
} else {
r[parseInt(key)] = parseInt(key)
}
})
return r
}