如何匹配两个对象数组的时间范围后计算差值并新增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
相关产品推荐
相关产品推荐

