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

使用Object.assign转数组为对象,如何以id为键而非索引?

解决数组转对象时用id作为键的问题

嘿,我懂你遇到的困扰了——Object.assign({}, obj)之所以会把数组索引(0、1)作为新对象的键,是因为数组本质上就是以数字索引为键的特殊对象,Object.assign只是把数组的可枚举属性(也就是那些索引)原样复制到目标对象里,自然不会用到元素里的id属性。

要实现把每个元素的id作为键来构建新对象,这里有两种实用的方法:

方法一:使用Array.prototype.reduce(兼容性好)

这是处理数组转对象场景的经典方案,逻辑清晰且支持所有现代浏览器:

var obj = [{ id: 1, value: 'abc' }, { id: 2, value: 'xyz' }];
const result = obj.reduce((accumulator, currentItem) => {
  // 把当前项的id作为键,当前项本身作为值存入累加器
  accumulator[currentItem.id] = currentItem;
  return accumulator;
}, {}); // 初始值是空对象

console.log(result);
// 输出: { '1': { id: 1, value: 'abc' }, '2': { id: 2, value: 'xyz' } }

方法二:使用Object.fromEntries(更简洁的ES2019+方案)

如果你项目环境支持ES2019及以上,可以用这个更简洁的写法,先把数组转成[键, 值]格式的二维数组,再转换成对象:

var obj = [{ id: 1, value: 'abc' }, { id: 2, value: 'xyz' }];
const result = Object.fromEntries(
  obj.map(item => [item.id, item])
);

console.log(result);
// 同样得到你想要的结果

这两种方法都能完美实现你的需求,选哪种就看你的项目兼容性要求啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:26:30