使用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
相关产品推荐
相关产品推荐

