日期数组过滤:每日仅保留一条日期记录实现方案咨询
解决日期数组每日仅保留一条记录的问题
嘿,我明白你遇到的困扰了!要实现这个每日仅留一条记录的需求,我们可以结合filter方法和一个Set来跟踪已经处理过的日期,思路很清晰,我给你一步步拆解:
核心思路
我们需要把每个日期字符串的**日期部分(忽略时间)**提取出来,用一个集合记录已经保留过的日期,这样遍历数组时,只保留每个日期第一次出现的那条记录,后续同日期的就直接过滤掉。
具体实现代码
let myDatesArray = [ "Sun Oct 01 2017 05:30:00 GMT+0530 (IST)", "Mon Oct 02 2017 05:30:00 GMT+0530 (IST)", "Mon Oct 02 2017 06:30:00 GMT+0530 (IST)", "Tue Oct 03 2017 05:30:00 GMT+0530 (IST)", "Wed Oct 04 2017 05:30:00 GMT+0530 (IST)", "Thu Oct 05 2017 05:30:00 GMT+0530 (IST)", "Fri Oct 06 2017 05:30:00 GMT+0530 (IST)", "Sat Oct 07 2017 05:30:00 GMT+0530 (IST)" ]; // 用Set来存储已经处理过的日期(仅日期部分,不含时间) const seenDates = new Set(); const filteredDates = myDatesArray.filter(dateStr => { // 将日期字符串转为Date对象,再提取仅含日期的字符串(比如"Mon Oct 02 2017") const dateOnly = new Date(dateStr).toDateString(); // 如果这个日期还没被记录过,就添加到Set并保留该元素 if (!seenDates.has(dateOnly)) { seenDates.add(dateOnly); return true; } // 已经有相同日期的记录了,过滤掉当前元素 return false; }); console.log(filteredDates);
代码说明
new Date(dateStr).toDateString():这个方法会把日期对象转换成不含时间、格式统一的字符串,比如所有10月2日的记录都会得到"Mon Oct 02 2017",这样就能准确识别同一天的不同时间记录。Set的作用是快速判断某个日期是否已经被保留过,它的has和add方法都是O(1)的时间复杂度,效率很高。- 最终
filteredDates里就会保留每个日期的第一条记录,10月2日的第二条记录会被成功过滤掉。
扩展小技巧
如果你需要保留每天的特定时间记录(比如最早/最晚的),可以先对数组按时间排序,再执行上面的过滤逻辑,这样就能得到你想要的那条记录啦~
内容的提问来源于stack exchange,提问作者Walter Monecke
相关产品推荐
相关产品推荐

