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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:55:37