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

在PugJS日历事件列表中为各月份添加对应HTML元素的实现问题

完全可以仅基于现有title和date字段实现该需求,不需要额外新增月份选择字段。
核心思路是先按月份对事件做归集,或者遍历事件时记录上一个处理的月份,仅在月份切换时开闭月份容器即可,两种实现方案如下:

方案1:先按月份分组再渲染(更易维护,推荐)

先在模板开头对事件数组做预处理,把同月份的事件归集到同一分组下,渲染时直接遍历分组即可:

- 
  // 数字月份转英文月份的映射表
  const monthMap = {
    '01': 'January', '02': 'February', '03': 'March', '04': 'April',
    '05': 'May', '06': 'June', '07': 'July', '08': 'August',
    '09': 'September', '10': 'October', '11': 'November', '12': 'December'
  }
  // 按月份分组事件,用年+月作为键避免不同年同月的事件混排
  const eventsByMonth = {}
  calendar_events.forEach(event => {
    const dateStr = event.primary.event_date
    const monthKey = dateStr.split('-', 2).join('-')
    if (!eventsByMonth[monthKey]) {
      eventsByMonth[monthKey] = {
        monthName: monthMap[dateStr.split('-')[1]],
        list: []
      }
    }
    eventsByMonth[monthKey].list.push(event)
  })

// 渲染分组后的事件
each monthData in Object.values(eventsByMonth)
  div(data-month=monthData.monthName)
    each event in monthData.list
      h2=event.primary.event_title[0].text
      p=event.primary.event_date

方案2:边遍历边处理(无需预处理分组)

如果不想额外做分组,也可以通过一个变量记录上一次处理的月份,仅在月份切换时开闭容器:

- 
  const monthMap = {
    '01': 'January', '02': 'February', '03': 'March', '04': 'April',
    '05': 'May', '06': 'June', '07': 'July', '08': 'August',
    '09': 'September', '10': 'October', '11': 'November', '12': 'December'
  }
  // 记录上一次处理的月份
  let lastMonthKey = null

each event in calendar_events
  - const dateStr = event.primary.event_date
  - const currentMonthKey = dateStr.split('-', 2).join('-')
  - const currentMonthName = monthMap[dateStr.split('-')[1]]

  // 月份发生变化时处理容器开闭
  if currentMonthKey !== lastMonthKey
    // 不是第一个月份的话,先闭合上一个容器
    if lastMonthKey !== null
      | </div>
    // 开启新月份的容器
    div(data-month=currentMonthName)

  // 渲染当前事件内容
  h2=event.primary.event_title[0].text
  p=event.primary.event_date

  - lastMonthKey = currentMonthKey

// 遍历结束后闭合最后一个月份的容器
if lastMonthKey !== null
  | </div>

你原有代码的问题是外层遍历每个事件时都会触发月份匹配逻辑,没有判断当前月份的容器是否已经创建,导致每个同月份事件都会生成新的容器,不符合预期。


内容的提问来源于stack exchange,提问作者Nuno Marques

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:06:02