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

循环响应函数开发问题:如何遍历数据并存储到数组中

解决服务响应数据转ResultsData数组的问题

嘿,我来帮你搞定这个数据转换的事儿!看起来你的核心需求是把嵌套结构的服务响应,展开成一个个独立的ResultsData对象数组对吧?我先帮你理清楚逻辑,再给你具体的代码实现。

首先提个小细节:你定义的ResultsData类里有个笔误——endDarte应该是endDate,这个得先修正,不然类型匹配会出问题。

先明确数据结构

你的服务响应是一个数组,每个顶层对象包含日期范围,还有personDetails数组;每个人员对象又包含timeDetails数组,而我们需要把每个时间条目都对应成一个ResultsData实例,毕竟每个时间段都是一个独立的结果项嘛。

具体转换实现

我用TypeScript给你写个清晰的转换函数,用flatMap来处理嵌套数组,避免最后得到多层嵌套的结果:

首先修正你的模型类:

/** 用于展示响应的模型 */
export class ResultsData {
  id: number;
  name: string;
  startDate: string;
  endDate: string; // 修正拼写错误
  startTime: string;
  endTime: string;
  city: string;
  country: string;
}

然后定义响应数据的类型(可选,但TypeScript里加了更安全):

// 定义响应数据的接口,方便类型检查
interface TimeDetail {
  startTime: string;
  endTime: string;
}

interface PersonDetail {
  id: number;
  name: string;
  timeDetails: TimeDetail[];
}

interface ServiceResponseItem {
  startDate: string;
  endDate: string;
  personDetails: PersonDetail[];
}

接下来是核心的转换函数:

function convertResponseToResultsData(response: ServiceResponseItem[]): ResultsData[] {
  return response.flatMap(topItem => {
    // 提取顶层的日期信息
    const { startDate, endDate, personDetails } = topItem;
    
    // 遍历每个人员,再遍历他们的时间条目
    return personDetails.flatMap(person => {
      const { id, name, timeDetails } = person;
      
      // 每个时间条目生成一个ResultsData对象
      return timeDetails.map(time => ({
        id,
        name,
        startDate,
        endDate,
        startTime: time.startTime,
        endTime: time.endTime,
        city: '', // 你的响应里没这个字段,先设默认值,后续可以根据实际情况修改
        country: '' // 同上
      } as ResultsData));
    });
  });
}

怎么用?

假设你的服务响应数据是这样的:

const response: ServiceResponseItem[] = [
  {
    startDate: '04/05/2018',
    endDate: '05/05/2018',
    personDetails: [
      {
        id: 5,
        name: 'kumar',
        timeDetails: [
          { startTime: '09:22pm', endTime: '08:33' },
          { startTime: '01:22pm', endTime: '01:33' }
        ]
      },
      {
        id: 4,
        name: 'smith',
        timeDetails: [
          { startTime: '10:00am', endTime: '05:00pm' }
        ]
      }
    ]
  }
];

// 调用转换函数
const results = convertResponseToResultsData(response);

转换后的results数组里,每个元素都是独立的ResultsData对象,正好符合你的需求。

注意事项

  1. 如果city和country字段其实是存在于响应的某个层级(比如顶层或者personDetails里),直接把默认值换成对应的字段就行
  2. 如果是用JavaScript,把类型定义去掉就行,逻辑完全一样
  3. flatMap是ES6+的方法,要是需要兼容旧环境,可以用map加concat来替代,比如把flatMap换成map(...).reduce((acc, curr) => acc.concat(curr), [])

内容的提问来源于stack exchange,提问作者Bhachi Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:41:53