You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中按时间周期合并periods和people两个对象数组的实现方法

问题分析

你现有代码的核心问题如下:

  1. 字段引用错误:混淆了periods和people数组的字段名,periods元素的日期字段是start_date/end_date,people元素的日期字段是start_date_org/end_date_org,你写反了不存在的字段名
  2. 存储逻辑错误:直接给d.period赋值单值,会导致后续匹配到的周期覆盖之前的结果,需求是存储所有匹配的周期,需要用数组存储
  3. 区间匹配逻辑错误:你只判断了组织周期开始时间在人员任职区间内,漏了其他重叠场景,标准的区间重叠判断逻辑为:组织周期开始 <= 人员任职结束 && 组织周期结束 >= 人员任职开始

正确实现代码

前置依赖

你原有的时间解析方法保持不变即可:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:27:04