You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法获取完整的扁平化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:28:02