JavaScript中按时间周期合并periods和people两个对象数组的实现方法
问题分析
你现有代码的核心问题如下:
- 字段引用错误:混淆了
periods和people数组的字段名,periods元素的日期字段是start_date/end_date,people元素的日期字段是start_date_org/end_date_org,你写反了不存在的字段名 - 存储逻辑错误:直接给
d.period赋值单值,会导致后续匹配到的周期覆盖之前的结果,需求是存储所有匹配的周期,需要用数组存储 - 区间匹配逻辑错误:你只判断了组织周期开始时间在人员任职区间内,漏了其他重叠场景,标准的区间重叠判断逻辑为:
组织周期开始 <= 人员任职结束 && 组织周期结束 >= 人员任职开始
正确实现代码
前置依赖
你原有的时间解析方法保持不变即可:
const parseTime = d3.timeParse("%Y-%m-%d")
第一种转换实现(按人员聚合所有匹配周期)
const result1 = people.map(person => { const matchedPeriods = [] const matchedYears = [] periods.forEach(period => { const perStart = parseTime(period.start_date) const perEnd = parseTime(period.end_date) const personStart = parseTime(person.start_date_org) const personEnd = parseTime(person.end_date_org) // 区间重叠判断 if (perStart <= personEnd && perEnd >= personStart) { matchedPeriods.push(period.period) matchedYears.push(new Date(perStart).getFullYear()) } }) // 返回新对象,避免修改原始people数组 return { ...person, periods: matchedPeriods, year: matchedYears } })
第二种转换实现(按单周期展开数据)
const result2 = result1.flatMap(person => { return person.periods.map((period, index) => { return { name: person.name, start_date_org: person.start_date_org, end_date_org: person.end_date_org, period: period, year: person.year[index] } }) })
内容的提问来源于stack exchange,提问作者console.log
相关产品推荐
相关产品推荐

