如何从JavaScript对象数组中仅提取本周已有数据?
解决方案
要从当月数据数组中提取本周已存在的记录,核心是统一日期格式/范围,再通过匹配快速筛选。以下分两种情况处理(对应你注释中提到的date为毫秒数和示例中的字符串格式):
情况1:原数据的date是字符串格式(如02/01/2023)
步骤1:生成本周有效日期集合
先把本周的日期转换成和原数据一致的字符串格式,同时过滤掉还未到的日期:
// 格式化Date对象为MM/DD/YYYY字符串 function formatDateToMMDDYYYY(date) { const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const year = date.getFullYear(); return `${month}/${day}/${year}`; } // 获取本周周一到周日的日期字符串,过滤掉今天之后的日期 const getValidWeekDates = () => { const today = new Date(); const todayStr = formatDateToMMDDYYYY(today); // 计算本周周一的日期 const weekStart = new Date(today); weekStart.setDate(today.getDate() - (today.getDay() === 0 ? 6 : today.getDay() - 1)); // 生成本周7天的日期字符串,只保留不晚于今天的 return Array.from({length:7}, (_, i) => { const date = new Date(weekStart); date.setDate(weekStart.getDate() + i); return formatDateToMMDDYYYY(date); }).filter(dateStr => dateStr <= todayStr); }; // 转成Set提升查找效率 const validWeekDates = new Set(getValidWeekDates());
步骤2:筛选原数据数组
遍历当月数据,只保留date在有效集合内的项:
// 假设monthlyData是你的当月数据数组 const weeklyExistingData = monthlyData.filter(item => { return item.date && validWeekDates.has(item.date); });
情况2:原数据的date是毫秒时间戳(注释标注date is in ms)
这种情况直接通过时间戳范围筛选更高效:
步骤1:计算本周时间范围
获取本周周一0点的时间戳,以及今天23:59:59的时间戳:
// 获取本周周一00:00:00的时间戳 const getWeekStartTimestamp = () => { const today = new Date(); const weekStart = new Date(today); weekStart.setDate(today.getDate() - (today.getDay() === 0 ? 6 : today.getDay() - 1)); weekStart.setHours(0, 0, 0, 0); return weekStart.getTime(); }; // 获取今天23:59:59的时间戳 const getTodayEndTimestamp = () => { const today = new Date(); today.setHours(23, 59, 59, 999); return today.getTime(); }; const weekStart = getWeekStartTimestamp(); const todayEnd = getTodayEndTimestamp();
步骤2:筛选原数据数组
直接过滤出时间戳在范围内的项:
const weeklyExistingData = monthlyData.filter(item => { return item.date && item.date >= weekStart && item.date <= todayEnd; });
这样就能动态获取本周从周一到当前日期的已有数据,自动忽略数组中不存在的未来日期。
内容的提问来源于stack exchange,提问作者nika
相关产品推荐
相关产品推荐

