合并一维与二维对象数组时产生多余项,排查问题原因
结合你描述的场景,递归函数mergeAccounts生成多余项,大概率是以下几个问题导致:
递归终止条件逻辑错误
如果递归函数处理单个账户对象(而非数组)时,没有直接返回该对象,反而错误地将其包装成{ accountInfo: [ [Object] ], tradingAccount: [ [Object] ] }这种结构,那每次处理到最终的单个对象时,都会生成这个包裹对象。遍历完所有数组元素后,这个额外的包裹对象就会被追加到结果数组末尾。
比如函数里可能写了类似错误逻辑:if (typeof item === 'object' && !Array.isArray(item)) { return { accountInfo: [item], tradingAccount: [item] }; }这种写法会把单个对象强制包装成目标结构,而非直接合并到结果数组中,最终导致多余项。
二维数组处理时的层级遗漏
subAccounts是二维数组,递归处理时如果没有正确遍历到最内层的对象:比如只处理了第一层数组,把每个子数组当成单个元素返回,没有继续递归拆解;或者在拼接结果时,用push替代concat,导致子数组的处理结果被整体作为一项加入,后续扁平化操作不当就会生成多余结构项。
示例错误逻辑:function mergeAccounts(arr) { let result = []; arr.forEach(item => { if (Array.isArray(item)) { result.push(mergeAccounts(item)); // 用push而非concat,子数组被当成一项 } else { result.push(item); } }); return result; }函数存在默认返回值污染
如果递归函数在没有匹配到数组或对象的分支时,默认返回了那个多余的对象结构(而非空数组或undefined),比如函数末尾写了:return { accountInfo: [], tradingAccount: [] };那当递归到空值、非预期类型这类边界条件时,这个默认返回的对象就会被加入结果数组,形成多余项。
两次调用的结果拼接错误
如果你用accounts = mergeAccounts(primaryAccount).concat(mergeAccounts(subAccounts))这类方式拼接结果,但其中某一次调用的返回结果里除了预期项,还额外包含了那个多余对象,拼接后自然会多出来。比如处理primaryAccount时,函数错误地在返回数组末尾追加了默认对象。
内容的提问来源于stack exchange,提问作者Chris McGlynn

