Node.js中如何正确实现两个日期数组的交集
解决Node.js中日期数组交集获取失败的问题
问题核心在于Date是引用类型,直接用===比较两个Date实例时,对比的是它们的内存引用地址,而非实际日期值——哪怕两个日期表示同一时间,它们也是不同的对象,所以o1 === o2永远返回false,导致filter/some组合无法找到交集。
几种可行的解决方案:
1. 比较日期的时间戳
通过getTime()方法获取日期对应的毫秒数(数值类型),直接比较数值是否相等:
const intersection = currentWeek.filter(o1 => holidaysDates.some(o2 => o1.getTime() === o2.getTime()));
2. 转换为标准日期字符串比较
把Date对象转成ISO格式字符串(如2024-05-01T00:00:00.000Z),或者只保留日期部分的字符串(如2024-05-01),再做字符串相等对比:
// 完整ISO字符串对比 const intersection = currentWeek.filter(o1 => holidaysDates.some(o2 => o1.toISOString() === o2.toISOString())); // 仅日期部分对比(更简洁) const intersection = currentWeek.filter(o1 => holidaysDates.some(o2 => o1.toISOString().split('T')[0] === o2.toISOString().split('T')[0]));
3. 生成数组时直接存储日期字符串
如果可以控制两个数组的生成逻辑,直接将日期转换为字符串(如YYYY-MM-DD格式)存储,后续用includes()就能直接筛选,代码更简洁:
// 示例:生成周日期数组时转成字符串 function generateWeekDates(startDate) { const week = []; for (let i = 0; i < 7; i++) { const date = new Date(startDate); date.setDate(startDate.getDate() + i); week.push(date.toISOString().split('T')[0]); // 存储YYYY-MM-DD字符串 } return week; } // 节假日数组也用字符串格式 const holidaysDates = ['2024-05-01', '2024-05-02']; const currentWeek = generateWeekDates(new Date('2024-04-29')); // 直接用includes筛选交集 const intersection = currentWeek.filter(date => holidaysDates.includes(date));
简化Demo验证
// 模拟生成两个Date对象数组 const currentWeek = [ new Date('2024-04-29'), new Date('2024-04-30'), new Date('2024-05-01'), new Date('2024-05-02') ]; const holidaysDates = [new Date('2024-05-01'), new Date('2024-05-03')]; // 错误写法:返回空数组 console.log(currentWeek.filter(o1 => holidaysDates.some(o2 => o1 === o2))); // [] // 正确写法:返回[2024-05-01T00:00:00.000Z] console.log(currentWeek.filter(o1 => holidaysDates.some(o2 => o1.getTime() === o2.getTime())));
内容的提问来源于stack exchange,提问作者Izlia
相关产品推荐
相关产品推荐

