如何按pid合并库存JSON并对instock求和及处理边缘场景
问题根因
你当前的合并逻辑本质是直接拼接两个order数组,没有按pid维度做去重和库存累计,因此会出现重复pid条目、库存值错误的问题。
正确合并逻辑
核心采用pid-库存映射表的方案,天然兼容所有你提到的边缘场景:
- 仅出现在单个文件的pid:直接保留对应库存值,无需额外判断分支
- 空order数组:遍历逻辑会自动跳过空列表,不会产生冗余项或报错
可运行实现示例(JavaScript)
处理JSON格式数据非常方便,还能额外兼容单文件内本身存在重复pid的极端情况:
// 输入示例 const payloadA = { "order": [ {"pid": "a", "instock": "2"}, {"pid": "b", "instock": "2"}, {"pid": "c", "instock": "2"} ] } // 兼容空数组场景:替换成 {"order": []} 也可正常运行 const payloadB = { "order": [ {"pid": "c", "instock": "2"}, {"pid": "d", "instock": "2"} ] } // 初始化pid到库存的累计映射 const stockMap = new Map() // 封装通用数据集处理函数 const handleDataset = (dataset) => { // 空order数组会直接跳过循环,无额外处理逻辑 dataset.order.forEach(item => { // 原始instock为字符串类型,转成数值后累加,最后再转回字符串保持格式一致 const stockNum = parseInt(item.instock, 10) stockMap.set(item.pid, (stockMap.get(item.pid) || 0) + stockNum) }) } // 依次处理两个数据集 handleDataset(payloadA) handleDataset(payloadB) // 映射表转回目标JSON结构 const mergedResult = { order: Array.from(stockMap, ([pid, totalStock]) => ({ pid, instock: String(totalStock) })) }
输出结果
{ "order": [ {"pid": "a", "instock": "2"}, {"pid": "b", "instock": "2"}, {"pid": "c", "instock": "4"}, {"pid": "d", "instock": "2"} ] }
边缘场景校验
- 空payloadB场景:当
payloadB.order为[]时,处理逻辑不会新增任何映射项,输出结果和payloadA完全一致 - 单文件独有pid场景:仅在A或仅在B存在的pid,会直接保留对应库存值,不会丢失
- 单文件内重复pid场景:如果单个文件的order数组里本身就有同pid多次出现的情况,也会自动累加库存,无需额外处理
注:如果你的
instock字段本身是数字类型,只需去掉代码里的parseInt和最后的String转换即可;如果有小数库存需求,把parseInt换成parseFloat即可。
内容的提问来源于stack exchange,提问作者maco
相关产品推荐
相关产品推荐

