You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:16:01