用 reduce 将数组转对象需以空对象为初始值,回调函数返回更新后的对象;可按字段作 key、条件聚合或用展开运算符避免副作用。

用 reduce 把数组转成对象,核心是把每个元素“累积”进一个初始为空对象中,按需设置键和值。关键在回调函数的返回值必须是更新后的对象,且初始值要设为 {}。
基础写法:按某个字段作 key,整个元素作 value
适合将数组转为以某属性为键、对应项为值的查找对象(类似 Map):
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 3, name: 'Charlie' }
];
const userMap = users.reduce((obj, item) => {
obj[item.id] = item; // 用 id 作 key,item 作 value
return obj;
}, {}); // 初始值必须是空对象
// 结果:{ 1: {id:1,name:'Alice'}, 2: {...}, 3: {...} }
更安全的写法:避免直接修改原对象
推荐用展开语法或 Object.assign 返回新对象,防止意外副作用:
- 用展开运算符(推荐):
const userMap = users.reduce((obj, item) => ({
...obj,
[item.id]: item
}), {});
- 用
Object.assign:
const userMap = users.reduce((obj, item) =>
Object.assign(obj, { [item.id]: item }),
{}
);
按条件聚合:多个元素合并到同一 key 下
比如按分类汇总数量、拼接列表等:
const orders = [
{ category: 'food', amount: 50 },
{ category: 'tech', amount: 200 },
{ category: 'food', amount: 30 }
];
const summary = orders.reduce((acc, order) => {
const { category, amount } = order;
if (!acc[category]) {
acc[category] = { total: 0, count: 0 };
}
acc[category].total += amount;
acc[category].count += 1;
return acc;
}, {});
// 结果:{ food: {total:80, count:2}, tech: {total:200, count:1} }
注意点
- 初始值
{}不可省略,否则第一次执行时obj是数组第一个元素,类型错乱 - 对象 key 若为数字或含特殊字符,用计算属性
[item.id]更稳妥 - 若需深拷贝或处理嵌套结构,
reduce内部需手动处理,不能只靠展开
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











