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

如何使用dayjs匹配住宿和体验的重合日期并整合为指定结构对象

实现方案

前置准备

如果要使用更便捷的日期区间判断逻辑,可以先引入dayjs的isBetween插件,不需要的话可以跳过这步:

import dayjs from 'dayjs'
import isBetween from 'dayjs/plugin/isBetween'
dayjs.extend(isBetween)

核心逻辑

我们采用「遍历所有住宿条目,筛选匹配的体验,组合后存入目标数组」的逻辑实现,代码如下:

const myTrips = []

// 遍历所有住宿
accomodation.forEach(accItem => {
  // 转换住宿的起止日期为dayjs对象
  const checkinDay = dayjs(accItem.fullCheckinDate)
  const checkoutDay = dayjs(accItem.fullCheckoutDate)
  // 筛选出日期落在当前住宿有效期内的体验
  const matchedExperiences = experiences.filter(expItem => {
    const expDay = dayjs(expItem.fullDate)
    // 方式1:用isBetween判断,[)表示左闭右开,即包含入住日,不包含退房日,符合常规住宿规则
    return expDay.isBetween(checkinDay, checkoutDay, 'day', '[)')
    // 方式2:不用isBetween插件的等价写法,不需要引入额外插件
    // return expDay.isSameOrAfter(checkinDay, 'day') && expDay.isBefore(checkoutDay, 'day')
  })
  // 将每个匹配的体验和住宿组合成目标结构,存入myTrips
  matchedExperiences.forEach(exp => {
    myTrips.push({
      accomodation: accItem,
      experiences: exp
    })
  })
})

说明

  • 常规住宿场景下退房当日不再计入有效住宿时长,所以用左闭右开区间,如果你需要把退房日也计入,只需要把判断条件的区间规则改成'[]',或者把无插件写法的第二个判断条件改为expDay.isSameOrBefore(checkoutDay, 'day')
  • 你给出的日期格式均为标准ISO日期格式,dayjs可以直接解析无需额外转换
  • 运行上述代码后得到的myTrips就是你需要的目标结构数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:36:01