如何在JavaScript中高效从本月文件中过滤掉本周文件
优化后的filterThisMonth实现
要实现「本月中除本周外的文件」且保证最高效,核心思路是减少遍历次数、避免重复创建Date对象、提前计算固定边界值,直接看优化后的代码:
filterThisWeek(files) { const firstDayOfWeek = new Date(new Date().setDate(new Date().getDate() - new Date().getDay())); return this.filterToday(files).filter((f) => f.date >= firstDayOfWeek); }, filterThisMonth(files) { const today = new Date(); // 提前算出本月第一天和本周第一天(和filterThisWeek的逻辑保持一致) const firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 1); const firstDayOfWeek = new Date(today.setDate(today.getDate() - today.getDay())); return files.filter((f) => { // 每个文件的日期只转一次Date,避免重复开销 const fileDate = new Date(f.date); // 条件:属于本月,且日期在本周开始之前 return fileDate >= firstDayOfMonth && fileDate < firstDayOfWeek; }); }
高效性说明
- 单次数组遍历:不像先筛本月再筛掉本周那样做两次遍历,一次
filter搞定所有判断,减少数组遍历开销 - 固定值预计算:本月第一天、本周第一天这些全局边界值只计算一次,不会在循环内重复计算浪费性能
- 减少Date实例创建:原代码中每个文件要创建两次Date对象做判断,现在只创建一次,节省内存和CPU资源
逻辑验证
你的filterThisWeek是筛选「本周(从周日到今日)的文件」,所以本月中排除这部分后,剩下的就是「本月开头到本周日之前」的文件,用fileDate >= firstDayOfMonth && fileDate < firstDayOfWeek完全匹配这个范围,逻辑准确。
内容的提问来源于stack exchange,提问作者the man in the pink suit
相关产品推荐
相关产品推荐

