TypeScript使用forEach()解析嵌套JSON取id/targets值失效问题
问题原因
你代码无输出、逻辑不生效有三个核心问题:
- 接口定义与实际返回的数据结构不匹配:你定义的接口中,日期字段对应的值为普通对象,但实际示例数据里日期对应的值是数组;且你定义的接口多了一层
index对象结构,实际数据中不存在这层嵌套。如果接口返回的根结构没有外层data包裹,你调用Object.values(responseDeploymentData.data)时实际传入的是undefined,自然不会触发forEach回调,也不会有任何输出。 - 属性访问逻辑错误:forEach回调中拿到的
state/date等是遍历出的值,不是固定属性名,你写的responseDeploymentData.data.state.date.index.id.targets是在访问字面量名为state/date的属性,完全没有用到遍历得到的变量;且嵌套层级和实际数据结构不对应,就算进入循环也会抛出属性访问错误。 - 遍历方法选择错误:你需要拿到
id这个键名本身(比如示例里的1855、1849),仅用Object.values()只能拿到属性值,拿不到对应的键名,无法实现「提取id和对应targets值」的需求。
修复方案
- 先修正TS接口定义,完全匹配实际数据结构:
// 先定义单条targets统计值的类型 interface TargetsStats { count_targets: number; count_targets_excluded: number; count_targets_pending: number; count_targets_in_progress: number; count_targets_completed: number; count_targets_failed: number; } // 修正后的外层接口,注意如果你的接口返回没有外层data字段,直接把StateMap作为参数类型即可 type StateMap = Record<string, Record<string, Array<Record<string, TargetsStats>>>>; interface CountTargetsData { data: StateMap }
- 用
Object.entries()替代Object.values()做遍历,同时拿到键名和值,逐层对应结构处理数组层:
const parseCounters = useCallback( async (responseDeploymentData: CountTargetsData) => { // 存储最终解析结果的变量,可根据你的需求调整结构 const parsedResult: Array<{ stateName: string; date: string; id: string; targets: TargetsStats }> = []; // 第一层:遍历state,拿到state名和对应值 Object.entries(responseDeploymentData.data).forEach(([stateName, stateValue]) => { // 第二层:遍历日期,拿到日期字符串和对应数组 Object.entries(stateValue).forEach(([dateStr, dateItemList]) => { // 第三层:遍历日期对应的数组,每个元素是存id的对象 dateItemList.forEach(idItem => { // 第四层:遍历拿到id和对应的targets统计值 Object.entries(idItem).forEach(([id, targetsStats]) => { // 此处即可拿到你需要的id和对应targets值,按需赋值或处理 console.log('当前解析到条目:', stateName, dateStr, id, targetsStats); parsedResult.push({ stateName, date: dateStr, id, targets: targetsStats }); }) }) }) }) // 后续使用parsedResult即可 return parsedResult; } );
注意:如果你的实际接口返回数据没有外层的
data包裹(即你提供的示例JSON就是接口返回的完整内容),直接把参数类型改成StateMap,第一层遍历直接遍历responseDeploymentData即可,不需要访问.data属性。
验证说明
用你提供的示例数据运行上述代码,会正确打印4条条目,分别对应示例里的4组id+targets数据,不会出现无输出的情况。
内容的提问来源于stack exchange,提问作者user19251203
相关产品推荐
相关产品推荐

