如何合并两个带ColData结构的API嵌套JSON对象并实现去重求和?
嵌套表格类JSON的合并实现方案
卡同步遍历逻辑的核心原因是把动态树结构的递归遍历,套用到了有固定业务规则的二维表格返回结构上,这类结构根本不需要逐节点对齐两个JSON的指针,按固定层级拆分处理就能绕开遍历卡点。
一、明确数据的固定层级边界
这类接口返回的结构是完全固定的,没有动态嵌套分支,不需要做无目标的全量递归:
- 顶层固定包含
Header、Rows两个字段 Rows下固定是Row数组,每个Row条目代表表格的一行- 每个Row下的
ColData集合代表当前行的所有单元格数据,其中ColData的首项内容是行的唯一匹配标识
二、替代同步遍历的分步执行逻辑
完全按照约定的合并规则,不用维护两个遍历指针,三步就能走完合并流程:
- 处理公共表头:两个接口返回的
Header内容完全一致,直接取任意一份的Header作为最终结果的表头即可,不需要逐节点比对 - 做行级匹配:
先遍历第一份返回的所有Row,把每个Row的ColData首项匹配值作为键,整行对象作为值存在索引Map里;再遍历第二份返回的所有Row,同样取ColData首项值查Map:- 匹配不到(属于单边独有行):直接把整行存入Map,保留原始行结构
- 匹配得到(属于双边共有行):不逐行做外层结构递归,只对两个行下的ColData集合做单元格级合并
- 做ColData单元格合并:
对匹配到的共有行的两套ColData集合,同样用ColData的标识字段做键建索引:- 某ColData只在单边存在:直接补全到最终的ColData集合里
- 某ColData在双边同时存在:取两边的value数值直接求和,作为该ColData的最终value值
三、同步遍历逻辑容易踩的误区
- 不要从最顶层开始维护两个同步遍历指针,遇到节点值不对就追加——这种逻辑会把两边顺序不一致的ColData错判为缺失项,最终生成重复的列数据
- 行匹配、ColData匹配的判断,只认ColData的业务标识值,不要依赖数组下标做匹配,不然两边返回的单元格顺序不一致时会直接匹配失效
核心处理逻辑的代码片段参考:
const rowIndex = new Map() // 遍历第一份数据建行索引 res1.Rows.Row.forEach(row => { const rowKey = row.ColData[0].value // ColData首项作为行匹配键 rowIndex.set(rowKey, row) }) // 遍历第二份数据做合并 res2.Rows.Row.forEach(row => { const rowKey = row.ColData[0].value const existRow = rowIndex.get(rowKey) if (!existRow) { rowIndex.set(rowKey, row) return } // 对共有行的ColData建列索引做合并 const colIndex = new Map() existRow.ColData.forEach(col => colIndex.set(col.key, col)) row.ColData.forEach(col => { const existCol = colIndex.get(col.key) if (!existCol) { colIndex.set(col.key, col) return } // 同ColData数值累加求和 existCol.value = Number(existCol.value) + Number(col.value) }) // 替换为合并后的ColData集合 existRow.ColData = Array.from(colIndex.values()) }) // 组装最终合并结果 const mergedResult = { Header: res1.Header, Rows: { Row: Array.from(rowIndex.values()) } }
内容的提问来源于stack exchange,提问作者rninkoyete
相关产品推荐
相关产品推荐

