ts-prime
Version:
A utility library for JavaScript and Typescript.
55 lines (50 loc) • 1.49 kB
text/typescript
import { purry } from './purry';
import { PredIndexedOptional, PredIndexed } from './_types';
/**
* Converts a list of objects into an object indexing the objects by the given key.
* @param array the array
* @param fn the indexing function
* @signature
* P.indexBy(array, fn)
* P.indexBy(fn)(array)
* @example
* P.indexBy(['one', 'two', 'three'], x => x.length) // => {3: 'two', 5: 'three'}
* P.pipe(
* ['one', 'two', 'three'],
* P.indexBy(x => x.length)
* ) // => {3: 'two', 5: 'three'}
* @category Array, Pipe
*/
export function indexBy<T>(
array: readonly T[],
fn: (item: T) => any
): Record<string, T>;
export function indexBy<T>(
fn: (item: T) => string | number
): (array: readonly T[]) => Record<string, T>;
export function indexBy() {
return purry(_indexBy(false), arguments);
}
const _indexBy = (indexed: boolean) => <T>(
array: T[],
fn: PredIndexedOptional<T, string | number>
) => {
return array.reduce((ret, item, index) => {
const value = indexed ? fn(item, index, array) : fn(item);
const key = String(value);
ret[key] = item;
return ret;
}, {} as Record<string, T>);
};
export namespace indexBy {
export function indexed<T, K>(
array: readonly T[],
fn: PredIndexed<T, any>
): Record<string, T>;
export function indexed<T, K>(
fn: PredIndexed<T, any>
): (array: readonly T[]) => Record<string, T>;
export function indexed() {
return purry(_indexBy(true), arguments);
}
}