JavaScript中遍历字典数组判断日期子串存在性并执行后续操作
解决方案
基础实现(直接使用字符串匹配)
利用数组的some()方法,该方法会遍历数组,只要有一个元素满足条件就立即返回true,非常适合判断"是否存在符合条件的元素":
const currentDate = '2022-01-26'; // 判断数组中是否存在date包含currentDate的假日 const isPublicHoliday = arr.some(d => d.date.includes(currentDate)); // 根据结果执行对应操作 if (isPublicHoliday) { // 这里写关闭电话线路的逻辑 console.log('今日是公共假日,关闭电话线路'); } else { console.log('今日正常营业'); }
为什么不用forEach?
forEach只是单纯遍历数组,无法直接返回"是否存在符合条件元素"的布尔值。你需要额外声明一个变量来记录状态,比如:
let isPublicHoliday = false; arr.forEach(d => { if (d.date.includes(currentDate)) { isPublicHoliday = true; // 即使找到也无法提前终止遍历,效率不如some } }); if (isPublicHoliday) { // 执行操作 }
显然some()更简洁高效,找到匹配项后会立即停止遍历。
结合moment-timezone的精准版本
字符串匹配存在潜在风险(比如currentDate为2022-01时会误匹配所有1月的日期),用moment-timezone可以精准处理时区和日期比较:
- 先安装依赖:
npm install moment-timezone
- 实现代码:
const moment = require('moment-timezone'); const currentDate = '2022-01-26'; // 设定目标时区(以澳大利亚悉尼为例,根据实际业务调整) const targetTimezone = 'Australia/Sydney'; // 将currentDate转为对应时区的"当日起始时刻"moment对象 const targetMoment = moment.tz(currentDate, 'YYYY-MM-DD', targetTimezone).startOf('day'); // 精准判断是否存在当日公共假日 const isPublicHoliday = arr.some(d => { // 解析假日的date字段,转为对应时区的"当日起始时刻" const holidayMoment = moment.tz(d.date, 'YYYY-MM-DD HH:mm:ss', targetTimezone).startOf('day'); // 比较两个日期是否完全相同(仅比较年/月/日) return holidayMoment.isSame(targetMoment); }); if (isPublicHoliday) { console.log('今日为公共假日,关闭电话线路'); // 执行关闭线路的具体逻辑 } else { console.log('今日正常运营'); }
扩展:获取当日假日详情
如果需要知道具体是哪个假日,可以用find()方法:
const todayHoliday = arr.find(d => { const holidayMoment = moment.tz(d.date, 'YYYY-MM-DD HH:mm:ss', targetTimezone).startOf('day'); return holidayMoment.isSame(targetMoment); }); if (todayHoliday) { console.log(`今日是${todayHoliday.name},关闭电话线路`); } else { console.log('今日正常营业'); }
内容的提问来源于stack exchange,提问作者Zhan Mushi Goate
相关产品推荐
相关产品推荐

