Object.fromEntries() 配合 Object.entries() 可实现带转换逻辑的浅拷贝:先拆键值对数组,再映射处理(改key/value、过滤、类型转换等),最后组装回对象;支持重命名key、类型安全浅拷贝(跳过原型属性但Symbol转字符串)、条件转换等场景。

Object.fromEntries() 配合 Object.entries() 可以实现带转换逻辑的浅拷贝,核心在于:先用 entries() 拆出键值对数组,再对每项做映射处理(比如改 key、改 value、过滤、类型转换等),最后用 fromEntries() 组装回对象。
基础用法:简单映射 value
比如把所有字符串值转为大写,数字值加 1:
const obj = { a: 'hello', b: 42, c: 'world', d: 100 };
const copied = Object.fromEntries(
Object.entries(obj).map(([key, value]) => [
key,
typeof value === 'string' ? value.toUpperCase() : value + 1
])
);
// → { a: 'HELLO', b: 43, c: 'WORLD', d: 101 }
重命名 key 或动态生成新 key
适合字段标准化场景,例如统一加前缀、驼峰转下划线、忽略特定 key:
- 加前缀:
[`prefix_${key}`, value] - 驼峰转连字符:
[key.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(), value] - 跳过某个 key:
filter(([key]) => key !== 'internal')
类型安全的浅拷贝(保留原始类型语义)
注意:entries() 会自动跳过原型链属性和不可枚举属性,但会将 Symbol 键转为字符串(丢失 Symbol 语义)。如需保留 Symbol,不能用 entries/fromEntries;若只处理字符串键,可放心使用。另外,null/undefined 值会被正常保留,但 Date、RegExp 等对象仍是引用——这符合“浅拷贝”定义,不是缺陷。
配合解构或默认值做条件转换
例如只对特定 key 做处理,其余保持原样:
const obj = { id: 123, name: 'alice', createdAt: new Date() };
const copied = Object.fromEntries(
Object.entries(obj).map(([key, value]) => {
if (key === 'id') return [key, `ID-${value}`];
if (key === 'name') return [key, value.trim()];
return [key, value]; // 不变
})
);










