You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:00:49