循环内过滤对象失效:如何按日期匹配证据与评估?
问题分析
你的代码问题在于,只是把所有符合日期条件的evidence直接推入evidencesPerAssessment数组,最终得到的是所有匹配项的平级列表,并没有将它们与对应的assessment关联起来,这就导致结果无法体现“每个assessment仅关联其范围内evidence”的需求。
解决方案
要实现每个assessment绑定其对应范围内的evidence,你需要遍历每个assessment,为其筛选出匹配的evidence后,将两者关联起来(比如给assessment添加一个evidences属性,或者生成包含两者的新对象)。
代码实现
let evidences = [ { id: 'ev1', name: 'evidence 1', uploadDate: new Date('2023-04-28') }, { id: 'ev2', name: 'evidence 2', uploadDate: new Date('2023-05-02') }, ]; let assessments = [ { id: 'ca1', name: 'assessment 1', startDate: new Date('2023-04-25'), endDate: new Date('2023-05-01') }, { id: 'ca2', name: 'assessment 2', startDate: new Date('2023-05-02'), endDate: new Date('2023-05-08') }, ]; // 生成每个assessment附带其匹配evidences的数组 let evidencesPerAssessment = assessments.map(assessment => { // 筛选当前assessment日期范围内的evidence const matchedEvidences = evidences.filter(evidence => { // 用getTime()转换为时间戳比较,避免时区差异导致的错误 const uploadTime = evidence.uploadDate.getTime(); const startTime = assessment.startDate.getTime(); const endTime = assessment.endDate.getTime(); return uploadTime >= startTime && uploadTime <= endTime; }); // 返回包含原assessment属性和匹配evidences的新对象 return { ...assessment, evidences: matchedEvidences }; }); console.log(evidencesPerAssessment);
结果说明
运行上述代码后,evidencesPerAssessment的结构如下:
[ { id: 'ca1', name: 'assessment 1', startDate: Date('2023-04-25'), endDate: Date('2023-05-01'), evidences: [{ id: 'ev1', name: 'evidence 1', uploadDate: Date('2023-04-28') }] }, { id: 'ca2', name: 'assessment 2', startDate: Date('2023-05-02'), endDate: Date('2023-05-08'), evidences: [{ id: 'ev2', name: 'evidence 2', uploadDate: Date('2023-05-02') }] } ]
完全符合你期望的“每个assessment仅关联其日期范围内evidence”的需求。
内容的提问来源于stack exchange,提问作者kkkjjj
相关产品推荐
相关产品推荐

