使用jQuery从日期数组中移除周六和周日的问题排查
解决移除日期数组中周末的问题
嘿,我来帮你揪出这个问题的根源!你遇到的这种「只能删掉周六或周日其中一个」的情况,大概率是踩了遍历原数组时直接删除元素导致索引错位的坑,而不是if条件判断的问题哦~
为什么会出现这个问题?
先看一个你可能写出的错误代码示例:
// 错误写法:直接遍历原数组并使用splice删除 const dateArray = [ new Date(2024, 8, 14), // 周六(getDay()返回6) new Date(2024, 8, 15), // 周日(getDay()返回0) new Date(2024, 8, 16) // 周一(getDay()返回1) ]; for (let i = 0; i < dateArray.length; i++) { const day = dateArray[i].getDay(); // 条件是对的:0=周日,6=周六 if (day === 0 || day === 6) { dateArray.splice(i, 1); // 删除当前元素 } } console.log(dateArray); // 结果可能还剩周日,没被删掉!
原因很简单:当你用splice删掉索引i的元素后,数组长度会减1,后面的元素会往前移动一位。但此时i还在继续递增,就会跳过原本在i+1位置的元素(现在它跑到了i的位置)。比如上面的例子,删掉周六后,周日变成了索引0,但i已经变成1,直接去处理周一了,周日就被漏掉了。
正确的解决方法
推荐两种靠谱的写法:
方法1:倒序遍历数组
从数组末尾往前遍历,这样删除元素不会影响前面未遍历的元素索引:
const dateArray = [ new Date(2024, 8, 14), new Date(2024, 8, 15), new Date(2024, 8, 16) ]; // 从最后一个元素往前遍历 for (let i = dateArray.length - 1; i >= 0; i--) { const day = dateArray[i].getDay(); if (day === 0 || day === 6) { dateArray.splice(i, 1); } } console.log(dateArray); // 正确保留周一
方法2:使用filter创建新数组(更推荐)
filter方法会返回一个新数组,完全不修改原数组,逻辑更清晰,也不会有索引问题:
const dateArray = [ new Date(2024, 8, 14), new Date(2024, 8, 15), new Date(2024, 8, 16) ]; // 过滤出非周末的日期:保留getDay()既不是0(周日)也不是6(周六)的日期 const workdays = dateArray.filter(date => { const day = date.getDay(); return day !== 0 && day !== 6; }); console.log(workdays); // 正确得到工作日数组
补充说明
你之前拆分if条件块没用,是因为核心问题不在条件判断本身——day === 0 || day ===6这个条件是完全正确的(记住getDay()返回0是周日,6是周六),问题出在遍历+修改原数组的操作逻辑上。
内容的提问来源于stack exchange,提问作者Cutis
相关产品推荐
相关产品推荐

