JavaScript递归遍历嵌套JSON修改键值时children遍历异常如何解决?
问题原因
你的代码核心错误出在children遍历的循环条件上:
原来的代码写的是for (let i = 0; i < entry.length; i++),这里的entry是Object.entries(instancias)返回的每一项,结构固定为[key, value],所以entry.length永远是2,也就是说你最多只会遍历children数组的前2个元素,当children长度大于2时会漏遍历,当children长度小于2时,访问value[i]就会得到undefined,递归传入undefined自然会出现异常。
修复方案
把循环条件改为取children数组本身的长度即可,同时可以简化代码逻辑,不需要遍历所有属性,直接访问指定字段即可,优化后的代码如下:
jsonAdapter(instancias: any) { // 直接处理recursoId相关字段,不需要遍历所有属性 if (instancias.recursoId) { // 这里补充你原来对recursoId、tipoRecurso、propietario的处理逻辑 // 比如取值、修改字段都可以直接操作,不需要嵌套forEach const tipoRecurso = instancias.recursoId.tipoRecurso; const propietario = instancias.recursoId.propietario; // 你的原有处理逻辑写在这里... } // 处理children递归 if (instancias.children && instancias.children.length > 0) { // 遍历children数组所有元素 for (let i = 0; i < instancias.children.length; i++) { this.jsonAdapter(instancias.children[i]); } } }
如果你要保留原来的遍历写法,只需要把循环条件改对即可:
if ((key === 'children') && value) { // 把entry.length改成value.length for (let i = 0; i < value.length; i++) { this.jsonAdapter(value[i]); } }
额外优化建议
- 你原来嵌套多层
Object.entries遍历没有实际意义,直接通过对象属性访问符.就能拿到对应字段的值,不需要遍历所有属性判断key,性能更高代码也更易读 - 可以增加非空判断,避免传入undefined或者null的时候报错
内容的提问来源于stack exchange,提问作者Danielmagox
相关产品推荐
相关产品推荐

