使用array.reduce分组数组时如何将返回值调整为指定id+content结构
代码修改方案
你当前的写法得到的是「id为键、同id数据数组为值」的对象,只需要把这个对象的键值对转换成要求的{id: xxx, content: xxx}结构数组即可。
完整修改代码
注意:reduce是同步方法,不需要加await,如果你的response本身是Promise,要先等待它resolve再调用reduce。
// 第一步:按messagesId分组得到分组映射对象 const groupMap = response.reduce(function (a, i) { a[i.messagesId] = a[i.messagesId] || []; a[i.messagesId].push(i); return a; }, {}); // 第二步:把分组映射转成目标结构的数组 const result = Object.entries(groupMap).map(([id, content]) => ({ id, content }));
如果需要写成链式调用也可以:
const result = response .reduce((a, i) => { a[i.messagesId] = a[i.messagesId] || []; a[i.messagesId].push(i); return a; }, {}) .entries() .map(([id, content]) => ({ id, content }));
补充说明
- 这种写法性能更高,对象键查找是O(1)复杂度,整体只需要遍历两次数据,比在reduce里每次查找对应id项的写法效率更高。
- 如果需要兼容极低版本的运行环境,可以用
Object.keys替代Object.entries实现转换:const result = Object.keys(groupMap).map(id => ({ id, content: groupMap[id] }));
内容的提问来源于stack exchange,提问作者AmandaConda
相关产品推荐
相关产品推荐

