33 lines
1.1 KiB
TypeScript
Executable File
33 lines
1.1 KiB
TypeScript
Executable File
/**
|
||
* 合并两个对象,仅当第二个对象的属性值不为null或undefined时进行覆盖
|
||
* 采用函数式编程风格,避免副作用,提升代码可读性和可维护性
|
||
*
|
||
* @param obj1 基础对象,其属性将被保留
|
||
* @param obj2 覆盖对象,仅非空属性会覆盖基础对象的对应属性
|
||
* @returns 合并后的新对象,原始对象不会被修改
|
||
*/
|
||
export function mergeIfDefined(
|
||
obj1: Record<string, unknown>,
|
||
obj2: Record<string, unknown>
|
||
): Record<string, unknown> {
|
||
// 使用reduce替代forEach,避免显式声明新对象,提升代码简洁性
|
||
return Object.entries(obj2).reduce((acc, [key, value]) => {
|
||
// 使用nullish coalescing operator简化条件判断
|
||
if (value != null) {
|
||
acc[key] = value;
|
||
}
|
||
return acc;
|
||
}, { ...obj1 }); // 使用对象展开运算符创建新对象,确保原始对象不被修改
|
||
}
|
||
|
||
interface Option<T> {
|
||
label: string;
|
||
value: T;
|
||
}
|
||
|
||
export function convertToOptions<T extends string | number>(obj: Record<T, string>): Option<T>[] {
|
||
return (Object.entries(obj) as [T, string][]).map(([value, label]) => ({
|
||
label,
|
||
value
|
||
}));
|
||
} |