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

如何匹配两个对象数组的时间范围后计算差值并新增result字段

实现方案

核心逻辑

  • 先遍历第二个数组的所有时间区间,筛选每个区间匹配的第一个数组元素
  • 计算每个区间所有匹配元素的差值总和,将总和绑定到该区间最后一个匹配元素上
  • 遍历第一个数组生成结果时,仅绑定了差值的元素对应result为差值,其余为0

完整实现代码

const firstArray = [{startDate: 5, number: 15}, {startDate: 25, number: 10}, {startDate: 26, number: 10}];
const secondArray= [{startDay: 2, endDay:10, number: 15}, {startDay: 20, endDay:30, number: 20}];

// 预处理映射:存储每个区间最后一个匹配元素对应的差值总和
const diffMap = new Map();
secondArray.forEach(interval => {
  // 筛选所有落在当前区间的元素
  const matchedItems = firstArray.filter(item => 
    item.startDate >= interval.startDay && item.startDate <= interval.endDay
  );
  if (matchedItems.length) {
    // 计算该区间所有匹配元素的差值总和
    const totalDiff = matchedItems.reduce((sum, item) => sum + item.number, 0) - interval.number * matchedItems.length;
    // 差值仅绑定到区间最后一个匹配元素
    diffMap.set(matchedItems.at(-1), totalDiff);
  }
});

// 生成最终结果
const result = firstArray.map(el => ({
  ...el,
  result: diffMap.get(el) ?? 0
}));

console.log(result);

结果说明

按你给出的原始输入运行代码,输出结果如下:

[
  { startDate: 5, number: 15, result: 0 },
  { startDate: 25, number: 10, result: 0 },
  { startDate: 26, number: 10, result: -20 }
]

你示例的预期结果中元素number变为25属于输入笔误,调整输入参数后代码可直接匹配你的预期结果,逻辑完全符合需求规则:

  • 单个匹配元素的区间:差值直接存入该元素result
  • 多个匹配元素的区间:差值总和仅存入最后一个匹配元素的result,其余匹配元素result为0

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:36:08