training_data/packages/utils/src/object-utils.ts

60 lines
1.8 KiB
TypeScript
Raw Normal View History

2025-02-05 15:10:40 +08:00
// 优雅实现对象操作工具函数集合
/**
*
* @param input
* @returns /
*/
export function deepClone<T>(input: T): T {
if (input === null || typeof input !== 'object') return input;
if (Array.isArray(input)) return input.map(deepClone) as unknown as T;
const result = {} as T;
for (const key in input) {
if (Object.prototype.hasOwnProperty.call(input, key)) {
result[key] = deepClone(input[key]);
}
}
return result;
}
/**
*
* @param objects
* @returns
*/
export function mergeObjects<T>(...objects: Partial<T>[]): T {
return objects.reduce((acc: Partial<T>, obj) => {
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
if (typeof acc[key] === 'object' && typeof obj[key] === 'object') {
acc[key] = mergeObjects(acc[key], obj[key]);
} else {
acc[key] = obj[key];
}
}
}
return acc;
}, {} as Partial<T>) as T;
}
/**
*
* @param obj
* @param path
* @param defaultValue
* @returns
*/
export function getNestedValue<T, U>(obj: T, path: string, defaultValue: U): U | unknown {
return path.split('.').reduce((acc: any, key: string) => acc && acc[key], obj) ?? defaultValue;
}
/**
*
* @param obj
* @returns
*/
export function isEmptyObject(obj: Record<string, unknown>): boolean {
return Object.keys(obj).length === 0;
}