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

JS筛选数组重复3次日期 实现日历对应日期禁用

需求说明

从存储日期字符串的数组中,筛选出重复出现恰好3次的日期项,用于日历组件中设置对应日期为不可选的禁用状态。

原有代码问题

你当前编写的双层循环逻辑存在核心问题:

  • 每次匹配到重复值就直接推入结果数组,会导致同一个日期被重复加入结果,无法得到去重后的符合条件的日期列表
  • 没有对每个日期的总出现次数做全局统计,无法精准判断日期是否刚好出现3次
  • 额外拼写问题:函数名disbaleDate拼写错误,正确写法应为disableDate

以你提供的测试数组为例,原有代码运行后会输出["1/6/2022", "1/6/2022", "1/6/2022"],而非预期的去重结果["1/6/2022"]。

正确实现方案

方案1:频次统计法(推荐)

先遍历数组统计每个日期的总出现次数,再筛选出频次等于3的日期,逻辑清晰性能更好:

function disableDate() {
  const dateArr = [
    "1/6/2022",
    "12/6/2022",
    "4/6/2022",
    "6/6/2022",
    "1/6/2022",
    "1/6/2022",
  ];
  // 统计每个日期的出现次数
  const dateCount = {};
  dateArr.forEach(date => {
    dateCount[date] = (dateCount[date] ?? 0) + 1;
  });
  // 筛选出出现3次的日期
  const disabledDates = Object.keys(dateCount).filter(date => dateCount[date] === 3);
  console.log(disabledDates); // 输出: ["1/6/2022"]
  return disabledDates;
}

disableDate();

方案2:修正双层循环写法

如果要保留循环写法,只需要先完成频次统计,再统一筛选符合条件的日期即可:

function disableDate() {
  const dateArr = [
    "1/6/2022",
    "12/6/2022",
    "4/6/2022",
    "6/6/2022",
    "1/6/2022",
    "1/6/2022",
  ];
  const dateCount = {};
  // 循环统计每个日期出现次数
  for (let i = 0; i < dateArr.length; i++) {
    const currentDate = dateArr[i];
    dateCount[currentDate] = (dateCount[currentDate] || 0) + 1;
  }
  const disabledDates = [];
  // 筛选出现次数为3的日期
  for (const date in dateCount) {
    if (dateCount[date] === 3) {
      disabledDates.push(date);
    }
  }
  console.log(disabledDates); // 输出: ["1/6/2022"]
  return disabledDates;
}

disableDate();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:54:18