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

for of循环仅执行一次求助:深度对象遍历取值异常

问题原因与解决方案

哈哈,这个问题的核心其实很简单——你被对象的层级结构给“骗”啦!

为什么循环只执行一次?

你的最外层对象jsonData本身只有一个键:searchNGResponse,所以Object.keys(jsonData)返回的数组长度是1,for...of自然只会循环一次,这就是isWantedValue只被调用一次的根本原因。

你控制台输出里的那个包含totalCount、from等键的对象,其实是jsonData.searchNGResponse的值,并不是最外层对象的直接键值对哦!

怎么修正代码提取目标值?

根据你的需求(提取不同层级的12个值),可以分两种情况处理:

1. 先处理第二层的目标值

如果你的目标值大部分在searchNGResponse这个内层对象里,直接先拿到内层对象再遍历:

const artifactColl = {};
// 先定位到内层的响应数据对象
const innerResponse = jsonData.searchNGResponse;

for (const key of Object.keys(innerResponse)) {
  console.log(key, innerResponse[key]);
  if (isWantedValue(key)) {
    artifactColl[key] = innerResponse[key];
  }
}

2. 递归遍历所有层级(适合深层级取值)

如果需要提取的12个值分布在不同层级(比如repoDetails、data里面的嵌套对象),写一个递归函数来遍历所有层级的键值对会更高效:

const artifactColl = {};

function extractTargetValues(obj, result) {
  for (const key of Object.keys(obj)) {
    const value = obj[key];
    // 判断当前键是否是需要的值
    if (isWantedValue(key)) {
      result[key] = value;
    }
    // 如果当前值是对象/数组,递归遍历深层结构
    if (typeof value === 'object' && value !== null) {
      if (Array.isArray(value)) {
        // 处理数组元素(比如你的totalCount、repoDetails都是数组形式)
        value.forEach(item => extractTargetValues(item, result));
      } else {
        extractTargetValues(value, result);
      }
    }
  }
}

// 调用递归函数开始提取
extractTargetValues(jsonData, artifactColl);
console.log(artifactColl);

补充说明

你提到“下方的console.log输出了所有必要的键值对”,应该是你把jsonData.searchNGResponse的内容当成了最外层对象的键值对,下次遇到这种层级深的对象,可以用console.dir(jsonData, { depth: null })来展开完整的结构,这样能更清晰地看到每一层的键哦!

内容的提问来源于stack exchange,提问作者Ruvi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:47:48