如何按SessionID分组获取首尾元素并计算时间差生成目标数组
嘿,我来帮你搞定这个问题!你的需求是按SessionID分组,算出每组首尾记录的时间差,然后转换成指定格式的数组对吧?之前的代码只存了索引没处理时间计算,所以没达到预期效果,我给你一个可行的解决方案:
核心思路
- 先按
SessionID对原数组进行分组,每个分组里保存对应的Name和所有记录的时间(转换成Date对象方便计算) - 对每个分组,取首尾两个时间计算差值,转换成分钟数(和你示例里的结果一致)
- 把每个分组的结果整理成你需要的
{Name, Time}结构,最终组成新数组
完整代码实现
var arr = [ { createdAt: '2020-02-08 17:30:46.367 +00:00', SessionID: 10, Name: 'Name1' }, { createdAt: '2020-02-08 17:40:47.465 +00:00', SessionID: 10, Name: 'Name1' }, { createdAt: '2020-02-08 17:45:48.596 +00:00', SessionID: 10, Name: 'Name1' }, { createdAt: '2020-02-08 17:50:49.747 +00:00', SessionID: 11, Name: 'Name2' }, { createdAt: '2020-02-08 17:52:50.814 +00:00', SessionID: 11, Name: 'Name2' }, { createdAt: '2020-02-08 17:54:51.918 +00:00', SessionID: 11, Name: 'Name2' } ]; // 1. 按SessionID分组,存储名称和时间 const sessionGroups = {}; arr.forEach(item => { const { SessionID, createdAt, Name } = item; // 如果当前SessionID还没创建分组,初始化结构 if (!sessionGroups[SessionID]) { sessionGroups[SessionID] = { Name, times: [] }; } // 将时间字符串转为Date对象存入分组 sessionGroups[SessionID].times.push(new Date(createdAt)); }); // 2. 计算时间差并生成目标数组 const newArr = Object.values(sessionGroups).map(group => { const { Name, times } = group; // 取分组的第一个和最后一个时间 const firstTime = times[0]; const lastTime = times[times.length - 1]; // 计算时间差(毫秒转分钟,取整) const timeDiffMinutes = Math.round((lastTime - firstTime) / (1000 * 60)); return { Name, Time: timeDiffMinutes }; }); console.log(newArr); // 输出结果完全符合你的期望: // [ { Name: 'Name1', Time: 15 }, { Name: 'Name2', Time: 4 } ]
代码解释
- 分组阶段:不再像你之前那样存索引,而是直接把每个SessionID对应的
Name和时间对象存起来,这样后续计算的时候不用再回头查原数组,效率更高。而且同一SessionID的Name是一致的,所以只需要存一次就够了。 - 计算阶段:用
Object.values(sessionGroups)拿到所有分组的数据,对每个分组取首尾时间,计算差值后转换成分钟数(1分钟=60*1000毫秒),用Math.round取整正好和你示例里的15、4分钟匹配。 - 如果你不需要取整,直接用
Math.floor或者保留小数也可以,根据需求调整就行。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

