Object.entries 配合 reduce 可灵活转换对象结构:支持键名变换、按值分组、字段重映射、键值反转等,关键在于将对象转为键值对数组后,在 reduce 累加器中构造目标结构,并确保返回累加器。

直接用 Object.entries 配合 reduce 可以把一个对象按需“翻转”“拆分”“聚合”或“映射”成新结构,关键在于把对象转为键值对数组后,在 reduce 的累加器中灵活构造目标结构。
基础转换:扁平对象 → 键值对数组 → 新对象
这是最常用场景:你想基于原对象的 key 或 value 做计算,生成结构不同的新对象。
例如,把用户信息对象中的字段名统一转为大写:
const user = { name: 'Alice', age: 30, city: 'Beijing' };
const upperCased = Object.entries(user).reduce((acc, [key, value]) => {
acc[key.toUpperCase()] = value;
return acc;
}, {});
// → { NAME: 'Alice', AGE: 30, CITY: 'Beijing' }
- 每次迭代拿到
[key, value],直接操作acc(初始为空对象) - 注意必须显式返回
acc,否则下一轮acc会变成undefined - 避免用箭头函数简写(如
(acc, [k,v]) => acc[k] = v),因为赋值表达式不返回对象
按值分类:把对象按某个属性值分组
比如有一组商品,想按 category 归类为嵌套对象:
const items = {
a: { name: 'iPhone', category: 'phone' },
b: { name: 'MacBook', category: 'laptop' },
c: { name: 'iPad', category: 'tablet' },
d: { name: 'AirPods', category: 'phone' }
};
const grouped = Object.entries(items).reduce((acc, [id, item]) => {
const cat = item.category;
if (!acc[cat]) acc[cat] = {};
acc[cat][id] = item;
return acc;
}, {});
// → { phone: { a: ..., d: ... }, laptop: { b: ... }, tablet: { c: ... } }
- 累加器初始化为
{},每轮检查目标分类是否存在,不存在就创建空对象 - 把原对象的 key(如
a)作为新结构里的子 key,保持原始标识 - 适合替代
Object.groupBy(尚未广泛支持)
提取并重映射:只保留特定字段 + 改名 + 转换类型
从 API 返回的原始数据中精炼出前端需要的结构:
const apiData = {
user_123: { id: 123, full_name: 'John Doe', is_active: true, created_at: '2023-05-01' },
user_456: { id: 456, full_name: 'Jane Smith', is_active: false, created_at: '2023-06-10' }
};
const normalized = Object.entries(apiData).reduce((acc, [key, val]) => {
acc[key] = {
id: val.id,
name: val.full_name,
active: Boolean(val.is_active),
createdAt: new Date(val.created_at)
};
return acc;
}, {});
- 每个 entry 都做字段重命名(
full_name → name)、类型修正(字符串日期 →Date)、布尔标准化(is_active转为Boolean) - 保留原始 key(如
user_123)作为新对象的顶层 key,方便后续查表 - 比
for...in更函数式,逻辑集中,易测试
反转键值对:当 value 是唯一且可作 key 时
适用于配置映射、状态码转提示等场景:
const statusMap = { 200: 'OK', 404: 'Not Found', 500: 'Server Error' };
const reversed = Object.entries(statusMap).reduce((acc, [code, msg]) => {
acc[msg] = Number(code); // 确保 key 是数字(若需)
return acc;
}, {});
// → { OK: 200, 'Not Found': 404, 'Server Error': 500 }
- 注意 value 必须是字符串或能安全转为字符串的值(否则可能丢失或覆盖)
- 如果原 value 不唯一,后出现的会覆盖先出现的 —— 这是 JS 对象 key 的自然行为
- 适合构建反向查找表,但慎用于含重复 value 的数据
核心就是把对象“解包”成二维数组,再用 reduce 当画布一笔一笔画出你想要的结构。只要明确输入输出形态,中间逻辑可以任意组合过滤、计算、嵌套,不复杂但容易忽略返回值和初始值。

















