Files
static-cms/packages/core/src/lib/util/object.util.ts
2022-12-15 13:44:49 -05:00

46 lines
1.1 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-explicit-any */
function setIn(target: any, path: (string | number)[], value: unknown): any {
if (path.length === 0) {
return value;
}
const pathSegment = path[0];
const restOfPath = path.slice(1);
if (Array.isArray(target)) {
const localTarget = [...(target ?? [])];
if (Number.isNaN(+pathSegment)) {
return localTarget;
}
const index = +pathSegment;
if (index < 0 || index >= localTarget.length) {
return localTarget;
}
localTarget[index] = setIn(localTarget[index], restOfPath, value);
return localTarget;
}
const localTarget = target ?? {};
return {
...localTarget,
[pathSegment]: setIn(localTarget[pathSegment], restOfPath, value),
};
}
export function set<T>(target: T, path: string | undefined | null, value: unknown): T;
export function set(target: any, path: string | undefined | null, value: unknown): any {
return setIn(
target,
(path ?? '').split('.').map(part => {
if (Number.isNaN(+part)) {
return part;
}
return +part;
}),
value,
);
}