递归实现嵌套对象结构转换未返回正确结果问题排查
对象结构转换问题排查与解决方案
原有代码的核心问题
- 递归调用函数名错误:
recursiveAssign方法内调用的this.test未定义,要么是笔误写错了递归函数名,要么是遗漏了对应方法实现,直接导致递归逻辑异常。 - 依赖对象键的索引顺序取值:通过
totalKeys[1]获取下级数组的逻辑完全不可靠,JS对象键的顺序在不同场景下可能有差异,且不同层级的下级数组键名不同(categories/subCategories/subSubCategories),不能用固定索引取值。 - 递归过程错误修改上层对象引用:递归函数中反复传入上层的
json对象并执行_.assign,会导致对象循环引用、层级混乱,出现自身拷贝的问题。 - 边界分支逻辑错误:当对象只有
label一个键时,执行_.assign(json, obj['label'])是把字符串赋值给对象,属于语法逻辑错误。 - 递归返回值逻辑混乱:没有明确每一层递归应该返回当前层级转换后的独立对象,而是和上层对象耦合。
正确实现方案
思路:每一层递归只处理当前层级的数组,为每个元素生成label: 子层级对象的键值对,子层级对象由对应下级数组递归生成,不需要依赖上层对象引用,也不需要关注下级数组的具体键名。
// 递归转换单层级数组 transformLevel(arr) { return _.reduce(arr, (result, item) => { // 取当前item的label作为键 const key = item.label; // 查找当前item中值为数组的下级属性 const childArr = _.find(_.values(item), _.isArray); // 下级数组为空则值为{},否则递归处理下级数组 result[key] = childArr?.length ? this.transformLevel(childArr) : {}; return result; }, {}); } // 入口方法 transform(typeObj) { return this.transformLevel(typeObj); }
内容的提问来源于stack exchange,提问作者gameFrenzy07
相关产品推荐
相关产品推荐

