如何定位JSON对象指定key,在该key对应数组中按id匹配目标条目
代码错误点梳理
for...in遍历对象得到的key是属性名的字符串值,不是对象本身,所以key['entries']属于语法错误,无法取到对应值- 无需遍历整个响应对象查找
entries属性,直接通过对象属性访问即可拿到目标数组 Array.find()的回调参数是数组的每一项条目对象,需要访问对象的id属性与目标值对比,不能直接用参数和matchThisId对比- 示例代码中的
fetchResponse对象description属性后缺失逗号,存在语法错误
最简实现方案
直接访问entries属性调用数组方法即可,代码如下:
const matchThisId = 2; const fetchResponse = { author: 'Mike', description: 'description', // 补全缺失的逗号 entries: [ {id: 1, url: 'url1'}, {id: 2, url: 'url2'}, {id: 3, url: 'url3'} ] } const targetEntry = fetchResponse.entries.find(item => item.id === matchThisId) // targetEntry即为匹配到的 {id: 2, url: 'url2'}
TypeScript报错解决方案
TS报错是因为你没有给响应对象声明类型,TS无法识别该对象存在entries属性,添加类型定义即可解决:
// 定义单条条目类型 interface Entry { id: number; url: string; } // 定义接口返回值类型 interface ResType { author: string; description: string; entries: Entry[]; } const matchThisId = 2; // 给响应对象指定类型 const fetchResponse: ResType = { author: 'Mike', description: 'description', entries: [ {id: 1, url: 'url1'}, {id: 2, url: 'url2'}, {id: 3, url: 'url3'} ] } const targetEntry = fetchResponse.entries.find(item => item.id === matchThisId)
如果是调用fetch接口动态获取的返回值,通过类型断言指定类型即可:
const fetchResponse = await fetch('请求地址').then(res => res.json()) as ResType
补充:for...in的正确写法(不推荐,仅做错误修正参考)
如果你确实需要用for...in遍历实现,修正后的代码如下:
let targetEntry = null for (let key in fetchResponse) { if (key === 'entries') { targetEntry = fetchResponse[key].find(item => item.id === matchThisId) break // 找到后跳出循环避免冗余遍历 } }
内容的提问来源于stack exchange,提问作者John McGellan
相关产品推荐
相关产品推荐

