如何用JavaScript按历史日期区间筛选带UNIX时间戳的对象
实现方案说明
你存储的created字段为秒级UNIX时间戳,而JS内置Date对象使用的是毫秒级时间戳,计算时仅需要做一次单位适配即可,不需要额外依赖createdDat字段。普通for循环完全可以实现过滤需求,也可以使用JS数组内置的filter方法获得更简洁的写法。
推荐方案:提前计算起止时间戳做数值对比(性能最优)
提前把目标日期转换为当天0点、次日0点的秒级时间戳,遍历的时候直接做数值比较即可,不需要对每个数组元素做日期转换,数据量大的时候性能优势明显:
// 示例数据 const data = [ {created: 1601820360, magic: -0.1, power: 0.1, createdDat: "2020-10-05"}, {created: 1601820365, magic: -0.8, power: 0.8, createdDat: "2020-10-05"}, // 更多数据... ] // 1. 定义你要筛选的目标日期 const targetDate = new Date('2020-10-05'); // 2. 计算目标日期当天0点的秒级时间戳 const startUnix = targetDate.getTime() / 1000; // 3. 计算目标日期次日0点的秒级时间戳 const endUnix = startUnix + 24 * 60 * 60; // 写法1:使用Array.filter(最简洁) const filteredResult = data.filter(item => item.created >= startUnix && item.created < endUnix); // 写法2:使用普通for循环(兼容旧环境,性能和filter一致) const filteredResult = []; for (let i = 0; i < data.length; i++) { const current = data[i]; if (current.created >= startUnix && current.created < endUnix) { filteredResult.push(current); } }
可选方案:遍历转日期字符串对比(适合灵活维度过滤)
如果需要按周、按月等灵活维度过滤,可以在遍历时把时间戳转为对应格式的字符串直接对比:
const targetDateStr = '2020-10-05'; const filteredResult = data.filter(item => { const itemDate = new Date(item.created * 1000); // 转为YYYY-MM-DD格式字符串和目标值对比 return itemDate.toISOString().split('T')[0] === targetDateStr; });
内容的提问来源于stack exchange,提问作者LeCoda
相关产品推荐
相关产品推荐

