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

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值」的需求。
修复方案
  1. 先修正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
}
  1. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:45:41