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
相关产品推荐
相关产品推荐

