拷贝对象时做属性过滤和重命名的核心是手动遍历键并按需处理:常用 object.keys + reduce 构建新对象,配合映射表(如 {oldkey: 'newkey', unwanted: null})实现筛选与重命名;也可用解构赋值快速处理固定字段;通用工具函数可支持白名单、重命名映射及可选深层拷贝;注意处理 undefined/null 值、不可枚举属性和 symbol 键需用 reflect.ownkeys。

拷贝对象时做属性过滤和重命名,核心是不直接用 Object.assign 或展开运算符,而是手动遍历键、按需处理后再组装新对象。
用 Object.keys + reduce 构建新对象
这是最常用也最灵活的方式:获取原始对象的键,筛选出需要保留的,再映射成目标键名,最后赋值对应值。
- 先定义一个映射表,比如
{ oldKey: 'newKey', unwanted: null },null表示该属性要被过滤掉 - 用
Object.keys(obj)获取所有键,filter去掉映射为null的项,再用reduce组装新对象 - 注意处理嵌套属性时,需额外递归或使用路径字符串(如
'user.name'),但基础场景通常只处理一层
用解构 + 重命名语法快速提取并改名
适用于已知固定字段、数量不多的情况,代码简洁,语义清晰。
- 比如
const { id: userId, name: fullName, age } = source;,这样就完成了过滤(只解构需要的)和重命名(冒号左边是原名,右边是新名) - 再用对象字面量组合:
const result = { userId, fullName, age }; - 缺点是无法动态控制字段,也不适合字段名来自变量的场景
封装一个通用工具函数
如果项目中多处需要类似逻辑,建议封装成可复用函数,支持传入过滤规则和重命名映射。
- 参数可以是:源对象、字段白名单数组(过滤)、重命名映射对象(如
{ email: 'contactEmail' }) - 内部先取白名单交集,再逐个判断是否需重命名,最后赋值
- 可选支持深层拷贝(用
JSON.parse(JSON.stringify())或结构化克隆 API),但要注意循环引用和特殊类型限制
注意点:null/undefined 值与原型链
默认的拷贝方式不会包含原型上的属性,也不会自动跳过 undefined 值——它们会被正常拷贝过去。
- 如果想跳过
undefined或null值,需在组装时加判断:if (value !== undefined && value != null) - 若源对象有不可枚举属性(如通过
Object.defineProperty设置),Object.keys拿不到,得用Reflect.ownKeys替代 - Symbol 键同样不会被
Object.keys返回,需结合Object.getOwnPropertySymbols











