JavaScript中XML转嵌套对象数组的首元素扁平化实现求助
问题分析
原代码的核心问题有两个:
- 函数逻辑强耦合「入参一定是数组」的前提,但是递归调用时传入的参数是普通对象,此时末尾的
return arr[0]完全不符合递归场景的预期,导致递归返回值无效 - 没有区分数组元素的类型:如果数组第一个元素是对象类型,需要先递归处理这个对象再赋值,原逻辑直接赋值的操作其实是后续遍历的时候修改了原对象才碰巧生效,逻辑本身不严谨
- 直接修改原输入对象,会产生不必要的副作用
优化实现
优化后的版本会统一判断输入类型,递归处理所有嵌套结构,且返回新对象避免修改原数据:
function flattenXMLResult(input) { // 输入是数组的情况,默认取第一个元素递归处理 if (Array.isArray(input)) { return flattenXMLResult(input[0]) } // 输入是对象的情况,遍历每个属性处理 if (typeof input === 'object' && input !== null) { const result = {} for (const key in input) { if (input.hasOwnProperty(key)) { // 每个属性值都递归处理后再赋值 result[key] = flattenXMLResult(input[key]) } } return result } // 基础类型直接返回 return input }
使用示例
直接把你拿到的nestedObj传入即可,不需要额外取[0]:
const nestedObj = [ { foo1:[ "A" ], foo2: [ { bar1: [ "B" ], bar2: [ "C" ] } ], foo3: [ "D" ] } ] const expectedData = flattenXMLResult(nestedObj)
运行后expectedData和你要求的结构完全一致。
逻辑说明
- 第一层判断先处理数组输入,不管是顶层的数组还是嵌套的属性数组,都会自动取第一个元素往下走,不需要外部手动处理
- 遇到对象就遍历所有属性,每个属性值都走递归逻辑处理,不管嵌套多少层都能正常解析
- 基础类型(字符串、数字等)直接返回,不需要额外处理
- 全程操作新生成的对象,不会修改原输入的XML解析结果
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

