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

如何将对象数组中的id值指定为键并重构数组结构

解决数组转id键值对对象的问题

嘿,我明白你的需求啦~你现在遇到的问题是用map之后得到的是一堆小对象组成的数组,而不是你想要的单个以id为键的大对象,对吧?

首先得纠正一个小细节:你写的目标结构[1:{id: 1, name: "john"}, 2:{id: 2, name: "doe"}]在JS里是不合法的哦,数组不能用这种自定义的非数字索引键,你实际想要的应该是一个普通对象,结构是{1: {id: 1, name: "john"}, 2: {id: 2, name: "doe"}}。

那怎么实现呢?用Array.reduce()就可以完美解决,这正是它的拿手活儿——把数组合并成单个值(这里就是合并成一个对象)。

基础实现代码

const myArray = [{id: 1, name: "john"}, {id: 2, name: "doe"}];
const transformedObj = myArray.reduce((accumulator, currentItem) => {
  // 把当前元素的id作为键,原对象作为值存入累加器
  accumulator[currentItem.id] = currentItem;
  // 返回累加器供下一次迭代使用
  return accumulator;
}, {}); // 初始值是空对象,作为累加器的起点

console.log(transformedObj);
// 输出:{1: {id: 1, name: "john"}, 2: {id: 2, name: "doe"}}

简洁版(ES6展开语法)

如果你喜欢更简洁的写法,也可以用对象展开语法:

const transformedObj = myArray.reduce((acc, item) => ({
  ...acc,
  [item.id]: item
}), {});

为什么你的map写法不行?

你用map的时候,每次迭代都会返回一个新的小对象(比如{1: {id:1, name:"john"}}),最终得到的是一个包含这些小对象的数组:[{1: {...}}, {2: {...}}],这和你想要的单个大对象结构完全不一样。而reduce则是把这些小对象的键值对逐个合并到同一个累加器对象里,最终得到你需要的结构。

内容的提问来源于stack exchange,提问作者Doge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:48:10