JavaScript如何按日期合并两个对象数组生成结构化日程列表
实现方案
逻辑很简单,全程按你的匹配规则走就行:
- 以
dates数组为遍历基准,保证最终输出的日程顺序和原日期顺序完全一致,不会遗漏任何日期 - 处理每个日期时,从训练计划数组里找出所有
scheduledAt和当前日期完全相等的条目 - 把日期和匹配到的训练条目组装成对象存入结果,没匹配到训练时训练列表自然是空数组,刚好符合你的要求
最直白的实现代码如下,小数据量直接用就行:
const schedule = dates.map(currentDate => { const matchedWorkouts = workouts.filter(item => item.scheduledAt === currentDate) return { date: currentDate, workouts: matchedWorkouts } })
注意:你给的预期输出示例里,把原始数据中
scheduledAt为2022-04-14T00:00:00.000Z的「Squat Clean 6 sets」放到了4月15的分组下,和原始数据字段值不匹配。上面的代码是严格按字段值相等做匹配,如果是你写示例时的笔误,直接用代码即可;如果确实需要做日期偏移之类的特殊逻辑,修改filter里的日期判断规则就行。
如果你的训练计划数据量很大,可以先做一次分组缓存,避免每次筛选都遍历整个训练数组,性能更好:
// 先把训练按日期分组存成哈希表 const workoutGroup = workouts.reduce((group, item) => { const key = item.scheduledAt if (!group[key]) group[key] = [] group[key].push(item) return group }, {}) // 遍历日期时直接从哈希表取对应训练,不用重复遍历 const schedule = dates.map(currentDate => ({ date: currentDate, workouts: workoutGroup[currentDate] || [] }))
两种写法最终输出的结构完全一致,单日期对应0个、1个、多个训练的场景都能正常处理。
内容的提问来源于stack exchange,提问作者Jean Cuervo
相关产品推荐
相关产品推荐

