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

如何定位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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 06:24:04