JavaScript中如何对含120+字段的大对象重命名属性并转换字段
如何将多字段Record对象转换为自定义Dto(重命名属性+时间戳转Date)
我有一个包含120多个字段的Record<string, unknown>类型对象,需要将其转换为自定义NewDto对象。新对象与原对象大部分字段一致,仅需重命名少量属性,并将部分微秒时间戳字段转换为Date对象。
原对象示例:
{ "id": 12, ... "created_at": 1577999390226497 // 微秒级时间戳 }
NewDto定义:
export class NewDto { client_id: number; ... client_created_at: Date; }
我尝试用对象扩展运算符处理但未成功,代码如下:
const newObject = { ...originalObject, id: client_id, created_at: convertToDate(created_at) } as NewDto;
问题原因
你原来的代码存在两个核心问题:
- 字段映射逻辑错误:
id: client_id是把未定义的client_id变量赋值给id字段,完全搞反了映射关系;且NewDto需要的是client_id和client_created_at,而非原字段名id和created_at。 - 原字段未清理:扩展运算符会保留原对象所有字段,导致新对象同时存在
id/client_id、created_at/client_created_at,不符合NewDto结构,类型断言自然无效。
解决方案
方案1:解构赋值+扩展运算符(适合少量字段修改)
通过解构取出需要处理的字段,剩余字段用剩余运算符保留,再合并处理后的目标字段:
首先定义时间转换函数(根据时间戳精度调整,示例为微秒转Date):
const convertToDate = (timestamp: number) => new Date(timestamp / 1000);
执行转换:
// 解构原对象,取出需要处理的字段,剩余字段存入rest const { id, created_at, ...rest } = originalObject as Record<string, unknown> & { id: number; created_at: number }; // 合并剩余字段与处理后的目标字段 const newObject: NewDto = { ...rest, client_id: id, client_created_at: convertToDate(created_at) };
方案2:通用转换函数(适合多字段修改场景)
如果后续有更多字段需要重命名或转换,可通过配置表维护规则,更易扩展和维护:
// 定义字段映射配置:key为原字段名,value为重命名目标或带转换函数的配置 const fieldMappings = { id: 'client_id', created_at: { newName: 'client_created_at', transform: (val: number) => new Date(val / 1000) } } as const; function convertToNewDto(original: Record<string, unknown>): NewDto { // 复制原对象所有字段 const result = { ...original }; // 遍历配置处理每个字段 for (const [oldName, config] of Object.entries(fieldMappings)) { if (typeof config === 'string') { // 单纯重命名 result[config] = result[oldName]; delete result[oldName]; } else { // 重命名+类型转换 result[config.newName] = config.transform(result[oldName] as number); delete result[oldName]; } } return result as NewDto; } // 使用示例 const newObject = convertToNewDto(originalObject);
内容的提问来源于stack exchange,提问作者JDev
相关产品推荐
相关产品推荐

