如何筛选出覆盖指定日期范围的Listings对象?
问题解决方案
问题根源
你的第二段filter逻辑犯了核心错误:用map方法返回布尔值数组,但filter需要的是单个布尔值来判断当前项是否保留。数组在布尔判断中永远为真,导致这一步过滤完全失效,所有价格符合条件的项都会被保留下来。
修正后的代码
// 提前预处理目标日期与价格,避免重复计算 const targetStart = new Date(range[0].startDate).setHours(0, 0, 0, 0); const targetEnd = new Date(range[0].endDate).setHours(0, 0, 0, 0); const minPriceNum = parseInt(minPrice); const maxPriceNum = parseInt(maxPrice); const filteredListings = listings.filter(listItem => { // 先做价格校验,不满足直接排除 const priceNum = parseInt(listItem.price); if (!(priceNum >= minPriceNum && priceNum <= maxPriceNum)) { return false; } // 检查是否存在符合条件的availability return listItem.availability.some(avail => { const availStart = new Date(avail.startDate).setHours(0, 0, 0, 0); const availEnd = new Date(avail.endDate).setHours(0, 0, 0, 0); return availStart <= targetStart && availEnd >= targetEnd; }); });
关键优化点
- 替换**
map为some**:some会遍历数组,只要找到任意一个满足条件的元素就返回true,完美匹配你「存在满足条件的availability」的需求 - 提前计算固定值:把目标日期、价格数值提前计算好,避免在循环中重复执行Date创建和字符串解析,提升性能
- 合并两次
filter:将价格校验与可用性校验合并到同一个filter中,减少数组遍历次数,代码更简洁高效
测试结果验证
用你提供的测试数据运行:
Place 1的所有availability都无法覆盖2022-12-01至2022-12-25的范围,会被过滤Place 2的availability从2022-11-30到2022-12-30,完全覆盖目标日期范围,会被保留
最终filteredListings仅包含Place 2,完全符合预期。
内容的提问来源于stack exchange,提问作者sevonchan
相关产品推荐
相关产品推荐

