如何使用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
相关产品推荐
相关产品推荐

