You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

问题原因

你原来的代码存在两个核心问题:

  1. 字段映射逻辑错误:id: client_id是把未定义的client_id变量赋值给id字段,完全搞反了映射关系;且NewDto需要的是client_id和client_created_at,而非原字段名id和created_at。
  2. 原字段未清理:扩展运算符会保留原对象所有字段,导致新对象同时存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:03:34