datum-focus
Version:
Data shape, model, metadata, JSON, JSON Schema, GraphQL, MongoDB query and aggregations, iterator generators
26 lines (21 loc) • 789 B
text/typescript
import { isArray } from './array';
import { isObject } from "./record";
type ValueType = bigint | boolean | number | string | symbol;
type NonObject = ValueType | Array<unknown>;
export interface Directory<Terminal extends NonObject> {
[key: string]: Terminal | Directory<Terminal>;
}
export const reduce = <Terminal extends NonObject>(
directory: Directory<Terminal>
): Record<string, Terminal> =>
Object.entries(directory).reduce<Record<string, Terminal>>(
(result, [left, val]) =>
!isObject(val) || isArray(val)
? Object.assign(result, { [left]: val })
: Object.entries(reduce(val)).reduce(
(acc, [right, terminal]) =>
Object.assign(acc, { [[left, right].join(".")]: terminal }),
result
),
{}
);