JavaScript给定时间范围下计算每日平均阅读时长并存入30天数组
每日平均阅读时长统计的实现方案
核心逻辑说明
原代码仅统计了每日的阅读记录条数,缺少计算平均值必需的两个统计维度:当日累计总阅读时长、当日有效记录数,无法直接通过现有计数值推导平均结果。整体实现拆为「累计双维度基础值→逐位计算最终平均值」两步即可,同时需要修正原代码的两处问题:
- 原代码直接把
getDate()返回的日数作为数组索引,未做0起始的索引偏移,会导致1号的记录存在索引1的位置,30号的记录直接超出长度为30的数组边界 - 原代码的
forEach语法缺失闭合右括号,运行时会直接触发语法错误
可直接运行的修正代码
// 初始化两个长度为30的统计数组,初始值均为0 // sumArr 存储当日累计阅读总时长 // countArr 存储当日有效阅读记录的条数 const sumArr = new Array(30).fill(0); const countArr = new Array(30).fill(0); bookDetails.forEach((obj) => { // 把日期对应的“当月第几天”转成数组索引:1号对应索引0,30号对应索引29 const dayIndex = new Date(obj.date).getDate() - 1; // 累计当日阅读总时长 sumArr[dayIndex] += obj.readingTime; // 当日记录数自增 countArr[dayIndex] += 1; }); // 逐位计算每日平均阅读时长 const dailyAvgReadTime = sumArr.map((totalTime, index) => { // 当日没有有效记录时返回0,有记录则用总时长除以记录数得到平均值 return countArr[index] === 0 ? 0 : totalTime / countArr[index]; });
结果匹配验证
代码运行后生成的数组和预期输出完全一致:
- 19号(对应数组索引18):总阅读时长为1231+909=2140,共2条记录,计算得平均值1070
- 20号(对应数组索引19):总阅读时长为190,共1条记录,平均值为190
- 21号(对应数组索引20):总阅读时长为1254+10=1264,共2条记录,计算得平均值632
- 其余无阅读记录的日期对应值均为0
实用提示:如果统计的月份不是30天(如2月、大小月),可以根据实际月份动态计算数组长度,避免出现索引越界问题。
内容的提问来源于stack exchange,提问作者Siva Pradhan
相关产品推荐
相关产品推荐

