如何在JavaScript中筛选指定日期范围内的对象数组数据
JavaScript 日期范围筛选实现方案
原代码存在的问题
- 未统一转换日期格式:直接对不同结构的日期字符串做大小对比会按字符编码逐位比较,无法得到正确的日期大小关系
- 筛选逻辑错误:原判断
e.cdate < sdate && e.cdate > edate逻辑冲突,不存在同时小于起始日期又大于结束日期的值 - 方法使用错误:
Array.filter本身就会返回符合条件的新数组,不需要手动声明空数组push元素,且原函数没有返回最终结果 - 日期解析错误:给定的
sdate、edate为日-月-年格式,直接传入Date构造函数会被错误解析,需要先调整为标准可识别格式。
正确实现代码
// 统一转换日期为时间戳,方便比较 function parseDate(dateStr, isDmyFormat = false) { if (isDmyFormat) { // 处理日-月-年格式的日期 const [day, month, year] = dateStr.split('-'); return new Date(`${year}-${month}-${day}`).getTime(); } return new Date(dateStr).getTime(); } function getDateRangeData(obj, sdate, edate) { const startTime = parseDate(sdate, true); const endTime = parseDate(edate, true); // 筛选cdate落在[startTime, endTime]区间的元素 return obj.orders.filter(item => { const currentTime = parseDate(item.cdate); return currentTime >= startTime && currentTime <= endTime; }); } // 测试用例 const obj = { orders:[ {id:1, mode: "xyz", orderid: 123, cdate: "2017-2-13 07:33:30"}, {id:2, mode: "abc", orderid: 456, cdate: "2018-4-20 06:10:30"}, {id:3, mode: "xyz", orderid: 768, cdate: "2020-8-10 08:00:00"} ] }; const sdate = "11-5-2020"; const edate = "20-2-2021"; // 调用方法得到结果 const result = getDateRangeData(obj, sdate, edate); console.log(result);
输出结果
[ { id: 3, mode: 'xyz', orderid: 768, cdate: '2020-8-10 08:00:00' } ]
内容的提问来源于stack exchange,提问作者ved
相关产品推荐
相关产品推荐

