如何修复JavaScript递归遍历对象替换值时嵌套字段不生效的问题
问题原因
- 递归处理嵌套子对象时,你没有接收
demoD(obj[key], toChange, newV)的返回值,处理后的新子对象直接被丢弃,后续给acc[key]赋值时用的还是原始未修改的子对象,所以嵌套层级的字段替换不会生效。 - 额外隐藏问题:
typeof null返回值为object,如果对象中存在值为null的字段,原有判断逻辑会把null当成对象触发递归,导致运行报错。
修复方案
将递归调用返回的新子对象赋值给对应key,同时补充null排除判断即可,修复后代码如下:
const demoD = ( obj, toChange, newV, ) => { return Object.keys(obj).reduce((acc, key) => { const currentVal = obj[key] // 仅对非null的对象做递归处理 if (typeof currentVal === 'object' && currentVal !== null) { acc[key] = demoD(currentVal, toChange, newV) } else { acc[key] = currentVal === toChange ? newV : currentVal } return acc }, {}) } const obj = { name: '', age: '687', demo: { test: '' } } console.log(demoD(obj, '', null))
运行后输出结果符合预期:
{ name: null, age: '687', demo: { test: null } }
内容的提问来源于stack exchange,提问作者Asking
相关产品推荐
相关产品推荐

