如何按日期过滤嵌套数组将NFL比赛按赛季周分组,避免硬编码17周条件
实现方案
核心逻辑是通过周数自动计算或预定义周区间的方式替代重复的硬编码判断,只需要一次遍历即可完成全部分组。
方案1:按日差自动计算周数(推荐,NFL常规赛通用)
利用NFL常规赛每周固定间隔7天的规则,直接计算比赛日期和赛季首日的天数差得到所属周数,代码最简洁:
// 赛季配置项,换赛季只需要改这两个参数 const seasonFirstDay = moment("2021-09-09"); // 2021赛季常规赛首日 const REGULAR_SEASON_WEEKS = 17; // 初始化17个空数组对应17周比赛 const weeklyGames = Array.from({length: REGULAR_SEASON_WEEKS}, () => []); for (const game of data) { const gameDate = moment(game[0]); // 计算和赛季首日的天数差,除以7取整得到周索引(0对应第1周) const dayDiff = gameDate.diff(seasonFirstDay, 'days'); const weekIndex = Math.floor(dayDiff / 7); // 过滤季前赛/季后赛的异常数据 if (weekIndex >= 0 && weekIndex < REGULAR_SEASON_WEEKS) { weeklyGames[weekIndex].push(game); } }
结果调用规则
weeklyGames[0]对应第1周所有比赛,和你原有weekOneArray完全等价weeklyGames[1]对应第2周,以此类推,weeklyGames[16]对应第17周
方案2:预定义周区间(适合有特殊调整的赛季)
如果赛季存在周区间不满足7天间隔的特殊调整,可以预定义所有周的起止时间,也不用写17个独立判断:
// 只需要一次性补全17周的起止时间即可 const weekRanges = [ ["2021-09-08", "2021-09-14"], // 第1周 ["2021-09-15", "2021-09-21"], // 第2周 // 依次补全剩下15周的时间区间 ]; const weeklyGames = Array.from({length: weekRanges.length}, () => []); for (const game of data) { const gameDate = moment(game[0]); for (let i = 0; i < weekRanges.length; i++) { // 第4个参数'[]'表示判断时包含起止日期,可根据你的isBetween规则调整 if (gameDate.isBetween(weekRanges[i][0], weekRanges[i][1], undefined, '[]')) { weeklyGames[i].push(game); break; } } }
内容的提问来源于stack exchange,提问作者user11631308
相关产品推荐
相关产品推荐

