JavaScript按小时键汇总访客数及查找最热门时段求助
解决思路与完整实现
嘿,作为JavaScript新手能想到用Map来聚合不同日期同一小时的访客数据,这个思路非常靠谱!咱们来把你的代码完善一下,还能优化得更简洁,最后再实现“找出访客最多时段”的核心需求~
首先先明确你的数据结构(我帮你修正了格式,让它符合JS语法):
const visitorData = [ { date: "25.05.2018", value: { 1: 209, 2: 123, 3: 890, /* ... */ 24: 789 } }, { date: "26.05.2018", value: { 1: 280, 2: 398, 3: 450, /* ... */ 24: 76 } } ];
第一步:用Map聚合各小时的总访客数
你的核心思路已经对了,只是可以把代码简化一下——利用Map的get方法可以返回默认值的特性,省去if判断:
// 初始化一个空Map,键是小时(字符串/数字),值是该小时的总访客数 const timesMap = new Map(); // 遍历每一天的数据 visitorData.forEach(item => { // 把当天每个小时的访客数拆成[key, value]数组遍历 Object.entries(item.value).forEach(([hourStr, count]) => { // 把小时转成数字(可选,如果你需要数字类型的话) const hour = parseInt(hourStr); // 累加:如果Map里已有这个小时,就取现有值加当前数,否则从0开始加 timesMap.set(hour, (timesMap.get(hour) || 0) + count); }); });
这段代码执行完后,timesMap里就存了每个小时的总访客数,比如timesMap.get(3)会返回890+450=1340。
第二步:找出访客最多的时段
现在我们需要从Map里找出值最大的那个键(小时),有两种简单的实现方式:
方式一:遍历Map直接比较
适合新手理解,逻辑清晰:
let maxCount = 0; let peakHour = -1; timesMap.forEach((totalCount, hour) => { if (totalCount > maxCount) { maxCount = totalCount; peakHour = hour; } }); console.log(`访客最多的时段是${peakHour}点,总访客数${maxCount}人`);
方式二:用数组的reduce方法(更“JS风格”)
把Map转成数组后,用reduce找出最大值对应的项:
// 把Map转成[[小时, 总访客数], ...]的数组 const hourCountArray = [...timesMap.entries()]; // 找出总访客数最大的项 const [peakHour, maxCount] = hourCountArray.reduce((prev, current) => { return current[1] > prev[1] ? current : prev; }, [0, 0]); // 初始值:[小时0,访客数0] console.log(`访客最多的时段是${peakHour}点,总访客数${maxCount}人`);
补充说明
如果你的原始数据解构(const { data: { data: [{ values }] } } = insightsData;)没问题,那直接把上面代码里的visitorData换成values就行。
内容的提问来源于stack exchange,提问作者Pogasta
相关产品推荐
相关产品推荐

