JavaScript如何按日期范围过滤包含嵌套日期值的分月对象数组?
事件数组按日期范围过滤实现方案
你原有代码存在2个问题:
- 直接对字符串类型的日期调用
getTime()会抛出错误,必须先转换为Date实例 - 仅判断月份维度的日期无法满足天级过滤需求,且无法过滤月份内无符合条件事件的分组
纯ES6实现
const dateRange = ["Nov 15 2021", "Dec 04 2021"]; // 提前转换起止日期为时间戳,避免重复转换损耗性能 const minTime = new Date(dateRange[0]).getTime(); const maxTime = new Date(dateRange[1]).getTime(); const filteredEvents = allEvents // 遍历每个月份分组,先过滤分组内符合时间范围的事件 .map(eventGroup => { const validEvents = eventGroup.value.filter(event => { const eventTimestamp = new Date(event.date).getTime(); return eventTimestamp >= minTime && eventTimestamp <= maxTime; }) // 返回处理后的分组,仅保留有效事件 return { ...eventGroup, value: validEvents }; }) // 筛除没有有效事件的空月份分组 .filter(eventGroup => eventGroup.value.length > 0);
运行以上代码得到的结果和你给出的预期返回完全一致。
Lodash实现(可选)
如果你习惯使用lodash,可以用更简洁的写法:
const minTime = new Date(dateRange[0]).getTime(); const maxTime = new Date(dateRange[1]).getTime(); const filteredEvents = _.chain(allEvents) .map(group => ({ ...group, value: _.filter(group.value, e => new Date(e.date).getTime() >= minTime && new Date(e.date).getTime() <= maxTime) })) .filter(group => !_.isEmpty(group.value)) .value();
内容的提问来源于stack exchange,提问作者ajaykarwal
相关产品推荐
相关产品推荐

