如何将JavaScript对象数组按指定key转换为对象?
如何将JavaScript对象数组转换为按
type分组的对象? 针对你的需求,最优方案是使用Array.reduce()——这是处理数组转单个聚合对象场景的标准且高效的方式,代码简洁、性能拉满。
先看你的原始数据:
const userArray = [ { name: 'John', email: 'user@mail.com', city: 'London', type: 'CLIENT' }, { name: 'Steve', email: 'stave@mail.com', city: 'Rome', type: 'USER' }, { name: 'Mark', email: 'mark@mail.com', city: 'Paris', type: 'ADMIN' } ];
实现代码
考虑到你给出的目标结构里,ADMIN类型的对象保留了type字段,而其他类型去掉了这个字段,我们可以在reduce里加个简单判断:
const transformedObj = userArray.reduce((acc, currentUser) => { // 解构拆分出type和其余属性 const { type, ...userWithoutType } = currentUser; // 根据type决定是否保留原对象的type字段 acc[type] = type === 'ADMIN' ? currentUser : userWithoutType; return acc; }, {}); // 初始值是空对象,作为累加器的起点
如果这只是你示例里的笔误,所有类型都需要去掉type字段,代码可以更精简:
const transformedObj = userArray.reduce((acc, { type, ...rest }) => { acc[type] = rest; return acc; }, {});
为什么这是最优方案?
- 性能最优:只需要遍历数组一次,时间复杂度为O(n),没有额外的冗余操作
- 语义清晰:
reduce的作用就是将数组"归约"为单个值,看到这个方法就能立刻明白代码意图 - 内存高效:不需要创建额外的中间数组或变量,直接在累加器上构建目标对象
执行后得到的结果完全符合你的需求:
{ CLIENT: { name: 'John', email: 'user@mail.com', city: 'London' }, USER: { name: 'Steve', email: 'stave@mail.com', city: 'Rome' }, ADMIN: { name: 'Mark', email: 'mark@mail.com', city: 'Paris', type: 'ADMIN' } }
内容的提问来源于stack exchange,提问作者Mauro74
相关产品推荐
相关产品推荐

