如何按周期匹配为dispatch数组补全quantity为0的缺失月份项
发药记录月份补全实现方案
核心思路
不要直接在原有dispatch数组上做插入操作,直接以标准months配置数组为基准生成对齐后的新数组,从根源上避免索引错位、插入位置错误的问题。
实现步骤
- 单条患者记录处理时,先将原有
dispatch数组转换为以period为键的映射表,省去重复遍历查找的开销 - 按原有顺序遍历标准
months数组(本身为要求的时间倒序),逐个匹配映射表中的发药记录:- 匹配到对应
period的记录时,直接将原记录放入结果数组 - 未匹配到记录时,生成补全对象:
month取对应月份配置的position值,year匹配配置的年份,quantity设为0,period与配置值保持一致,放入结果数组
- 匹配到对应
- 用生成的长度固定为7的结果数组替换原记录的
dispatch字段即可,最终顺序与标准月份配置完全对齐
可直接运行的代码示例
function completeDispatch(records, standardMonths) { return records.map(record => { // 构建现有发药记录的映射表 const dispatchMap = new Map(); record.dispatch.forEach(item => { dispatchMap.set(item.period, item); }); // 按标准月份顺序生成完整发药数组 const fullDispatch = standardMonths.map(monthItem => { if (dispatchMap.has(monthItem.period)) { return dispatchMap.get(monthItem.period); } // 补全缺失月份的0值记录 return { month: monthItem.position, year: monthItem.year, quantity: 0, period: monthItem.period }; }); return { ...record, dispatch: fullDispatch }; }); } // 调用方式:传入接口返回的records数组、7个月标准配置的months数组即可 // const result = completeDispatch(apiResponse.records, monthConfig.months);
之前插入逻辑失效的原因
直接在原
dispatch数组上通过splice方法插入的写法很容易出错:原数组长度、元素顺序和标准月份不一致,遍历插入过程中原数组长度动态变化,会导致索引计算偏移,最终出现插入位置错误、漏插、重复插入的问题。基于标准配置生成新数组的写法完全规避了这类问题。
内容的提问来源于stack exchange,提问作者OCBP
相关产品推荐
相关产品推荐

