讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

如何在JavaScript中高效重命名并转换大型对象属性

陌涛小哥_6503

陌涛小哥_6503

发布时间:2025-09-29 10:22:01

|

517人浏览过

|

来源于php中文网

原创

如何在JavaScript中高效重命名并转换大型对象属性

本文介绍如何在JavaScript中高效地对大型对象进行属性重命名和类型转换。通过结合使用解构赋值和展开运算符,可以简洁明了地将原始对象的特定属性重命名、应用函数进行类型转换,同时保留其他未修改的属性,从而生成符合新数据模型要求的新对象。

在处理包含大量字段的javascript对象时,我们经常需要将其转换为另一种结构的对象,例如为了适应新的api接口或前端数据模型。这种转换通常涉及两类操作:一是重命名某些属性,二是将某些属性的值进行类型转换(如将毫秒时间戳转换为 date 对象)。直接遍历或手动复制所有属性效率低下且容易出错,而简单使用展开运算符 (...) 无法直接实现属性重命名和函数应用。

核心策略:解构赋值与展开运算符

解决这类问题的关键在于巧妙地结合使用JavaScript的解构赋值 (Destructuring Assignment) 和 展开运算符 (Spread Syntax)。

  1. 解构赋值重命名属性: 当从对象中解构属性时,我们可以同时对其进行重命名。语法是 { originalName: newName }。
  2. 解构赋值捕获剩余属性: 通过使用 ...rest 语法,我们可以将对象中除了被显式解构的属性之外的所有其他属性收集到一个新的对象中。
  3. 展开运算符构建新对象: 最后,我们可以使用展开运算符将 rest 对象的所有属性复制到新对象中,然后添加重命名后的属性和经过类型转换的属性。

这种方法允许我们精确地选择需要修改的属性,同时保持代码的简洁性和可读性。

实践示例与详细解析

假设我们有一个包含120多个字段的原始对象,其中 id 字段需要重命名为 client_id,而 created_at 字段(毫秒时间戳)需要转换为 Date 对象并重命名为 client_created_at。

首先,我们定义原始对象和目标对象的类型(在TypeScript环境中,这有助于类型检查和代码提示):

立即学习“Java免费学习笔记(深入)”;

// 原始对象类型示例
interface OriginalObject {
  id: number;
  name: string;
  created_at: number; // 毫秒时间戳
  // ... 其他100多个字段
  [key: string]: unknown; // 允许存在其他任意字段
}

// 目标对象类型示例
export class NewDto {
  client_id: number;
  name: string;
  client_created_at: Date;
  // ... 其他100多个字段,与OriginalObject中未修改的字段保持一致
}

// 辅助函数:将毫秒时间戳转换为Date对象
function convertToDate(timestamp: number): Date {
  return new Date(timestamp);
}

// 示例原始数据
const originalObject: OriginalObject = {
  id: 12,
  name: "Sample Client",
  created_at: 1577999390226, // 示例毫秒时间戳
  status: "active",
  // ... 更多字段
};

接下来,我们使用解构赋值和展开运算符执行转换:

HISUI 前端框架开发指南(IRIS版)
HISUI 前端框架开发指南(IRIS版)

HISUI 前端框架基础开发指南。HISUI 是基于 easyui 二次开发的 jQuery UI 组件库,专为医疗信息系统设计。当涉及 HISUI 组件开发、jQuery easyui 表格/表单/布局/窗口、医疗系统前端页面编写时使用此 skill。 涵盖 40 个组件的官方文档参考,支持声明式与编程式两种初始化方式,提供 $cm/$m 数据访问方法。

下载
// 步骤1:使用解构赋值重命名'id',并捕获其余属性
const { id: client_id, created_at, ...rest } = originalObject;

// 步骤2:构建新的对象
const newObject: NewDto = {
  ...rest, // 展开所有未修改的属性
  client_id, // 添加重命名后的'client_id'
  client_created_at: convertToDate(created_at), // 转换并添加'client_created_at'
};

console.log(newObject);
/*
输出示例 (部分字段):
{
  name: "Sample Client",
  status: "active",
  // ... 其他rest中的字段
  client_id: 12,
  client_created_at: "2020-01-02T02:29:50.226Z" // Date对象,具体格式取决于console.log的输出
}
*/

代码解析:

  1. const { id: client_id, created_at, ...rest } = originalObject;
    • id: client_id:从 originalObject 中提取 id 属性的值,并将其赋值给一个名为 client_id 的新变量。此时,originalObject 中的 id 属性实际上已被“提取”出来,不再包含在 rest 对象中。
    • created_at:从 originalObject 中提取 created_at 属性的值,并赋值给同名变量 created_at。与 id 类似,它也不再包含在 rest 对象中。
    • ...rest:这是一个“剩余属性”语法。它会收集 originalObject 中除了 id 和 created_at 之外的所有其他属性,并将它们封装到一个名为 rest 的新对象中。
  2. const newObject: NewDto = { ...rest, client_id, client_created_at: convertToDate(created_at), };
    • ...rest:将 rest 对象中的所有属性展开并复制到 newObject 中。
    • client_id:将第一步中重命名得到的 client_id 变量的值添加到 newObject 中。
    • client_created_at: convertToDate(created_at):调用 convertToDate 函数处理原始的 created_at 值,然后将结果赋值给 newObject 的 client_created_at 属性。

通过这种两步法,我们既实现了属性的重命名,又完成了特定属性的类型转换,同时保留了大部分未修改的属性,整个过程清晰且高效。

处理多个属性的场景

如果需要重命名和转换的属性更多,可以扩展解构赋值的语法:

// 假设还有 updated_at 需要转换为 Date,并重命名为 client_updated_at
const {
  id: client_id,
  created_at: raw_created_at, // 提取原始created_at
  updated_at: raw_updated_at, // 提取原始updated_at
  ...rest
} = originalObject;

const newObject: NewDto = {
  ...rest,
  client_id,
  client_created_at: convertToDate(raw_created_at),
  client_updated_at: convertToDate(raw_updated_at),
};

在这里,我们通过 created_at: raw_created_at 和 updated_at: raw_updated_at 的语法,将原始属性值提取到带有 raw_ 前缀的临时变量中,以便在新对象中进行转换。

注意事项

  1. 对象不可变性: 这种方法会创建一个全新的对象 newObject,而不会修改 originalObject。这符合函数式编程的原则,有助于避免副作用,使代码更易于理解和维护。
  2. 类型安全 (TypeScript): 在TypeScript项目中,明确定义 OriginalObject 和 NewDto 接口或类,并在转换时指定 newObject 的类型为 NewDto,可以确保转换后的对象符合预期结构,并在编译时捕获潜在的类型错误。
  3. 辅助函数: convertToDate 这样的辅助函数是业务逻辑的关键。根据实际需求,可能需要创建更多类似的函数来处理不同类型的转换(如字符串解析、数值计算等)。
  4. 性能考量: 对于大多数常规应用场景,解构赋值和展开运算符的性能开销可以忽略不计。JavaScript引擎对这些现代语法有很好的优化。对于处理数百万级别字段的极端情况,可能需要更底层的优化,但通常不必要。
  5. 属性顺序: 使用展开运算符时,属性的顺序可能会受到JavaScript引擎实现的影响。通常,在展开 ...rest 之后添加的属性会覆盖 rest 中同名的属性。但对于本例,我们是添加新名称的属性,所以顺序不是问题。

总结

通过巧妙地结合使用解构赋值进行属性重命名和提取,以及展开运算符进行对象合并和属性添加,我们能够以一种声明式、简洁且高效的方式,将大型JavaScript对象转换为新的数据模型。这种模式在数据转换、API响应处理和状态管理等场景中都非常实用,极大地提高了代码的可读性和可维护性。掌握这一技巧,将使你在处理复杂对象转换时游刃有余。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

332

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

540

2026.02.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

411

2026.03.13

TypeScript 全栈开发进阶指南
TypeScript 全栈开发进阶指南

面向有 JavaScript 基础的开发者,深入讲解 TypeScript 的类型系统与全栈开发实践。

326

2026.06.03

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

758

2026.06.16

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6384

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3484

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1932

2025.10.17

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn