无法获取完整的扁平化JavaScript对象结构问题排查
解决嵌套对象中递归提取指定键值对的问题
我看了你的代码,问题主要出在两个核心点上:递归调用时没收集返回的结果,还有判断变量没有独立重置。下面是修复后的完整函数,以及详细的修改说明:
function getKeysVals(obj, keys, recurse = false) { let out = []; obj.forEach((thisObj) => { let addToOutput = true; let newObj = {}; // 检查当前对象是否包含所有指定键且对应值非空 for (const key of keys) { if (!thisObj[key]) { addToOutput = false; break; } newObj[key] = thisObj[key]; } // 符合条件则加入输出数组 if (addToOutput) { out.push(newObj); } // 递归处理嵌套子对象,并合并结果到主数组 if (recurse && thisObj[recurse]) { const nestedResults = getKeysVals(thisObj[recurse], keys, recurse); out = out.concat(nestedResults); } }); return out; }
关键修改说明:
- 重置判断变量:把
addToOutput移到forEach循环内部,确保每个对象的判断都是独立的,不会被前一个对象的结果干扰。原代码里这个变量在循环外,一旦某个对象不符合条件,后续所有对象都会被错误跳过。 - 收集递归结果:原代码只是调用了递归函数,但没有把返回的嵌套对象结果合并到主输出数组里。现在用
concat把递归返回的数组和主数组合并,嵌套层的符合条件对象就能被正确收集。 - 优化遍历与变量声明:把
for...in改成for...of遍历指定键数组,同时给循环变量加上const声明,避免全局变量污染,逻辑也更清晰。 - 语义化遍历方法:用
forEach替代map,因为原代码并没有用到map的返回值,forEach更贴合“遍历处理每个对象”的语义。
验证结果
调用result = getKeysVals(nodes[0].nodes, ['id', 'text', 'filePath'], 'nodes');后,就能得到你预期的完整结果:
[ { id: 1526297185466, text: 'test part a', filePath: 'test part a-1526297185451.CSV' }, { id: 1526297202132, text: 'test part B', filePath: 'test part B-1526297202118.CSV' }, { id: 1526297209980, text: 'Test Part C', filePath: 'Test Part C-1526297209966.CSV' } ]
这样就能递归提取所有层级中包含指定全部键且值非空的对象了。
内容的提问来源于stack exchange,提问作者simonl
相关产品推荐
相关产品推荐

