JavaScript实现对象数组按用户分组合并时间字段到entries数组
解决方案
通用groupBy方法仅能完成按指定键归类元素的基础逻辑,不会自动提取公共字段、重组嵌套子数组结构,这是你得到的结果不符合预期的核心原因。直接用下面的单次遍历实现即可,时间复杂度O(n),性能最优,输出结构完全匹配要求:
const rawData = [ {"username":"player1","nickname":"PLayer1","capturedate":"06/12/2022","capturetime":"10:05PM"}, {"username":"player1","nickname":"PLayer1","capturedate":"06/12/2022","capturetime":"10:00PM"}, {"username":"player1","nickname":"PLayer1","capturedate":"06/12/2022","capturetime":"10:10PM"}, {"username":"player1","nickname":"PLayer1","capturedate":"06/12/2022","capturetime":"10:15PM"}, {"username":"player2","nickname":"player2","capturedate":"06/12/2022","capturetime":"10:00PM"}, {"username":"player2","nickname":"player2","capturedate":"06/12/2022","capturetime":"10:05PM"} ]; const groupMap = new Map(); for (const item of rawData) { if (!groupMap.has(item.username)) { groupMap.set(item.username, { username: item.username, nickname: item.nickname, entries: [] }); } groupMap.get(item.username).entries.push({ capturedate: item.capturedate, capturetime: item.capturetime }); } const result = Array.from(groupMap.values());
实现逻辑说明
- 用
Map做临时分组存储比普通对象查找效率更高,全程仅需遍历一次原始数组,没有额外性能损耗 - 首次匹配到新用户时,直接留存
username、nickname两个公共字段,初始化空的entries数组用于存储时间记录 - 所有记录的时间字段只会提取
capturedate、capturetime两个属性推入entries,不会产生冗余字段 - 如果需要对entries内的时间做排序、去重,或统一修正nickname的大小写格式,在遍历完成后针对对应字段加处理逻辑即可
内容的提问来源于stack exchange,提问作者kams
相关产品推荐
相关产品推荐

