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
相关产品推荐
相关产品推荐

