循环响应函数开发问题:如何遍历数据并存储到数组中
解决服务响应数据转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对象,正好符合你的需求。
注意事项
- 如果
city和country字段其实是存在于响应的某个层级(比如顶层或者personDetails里),直接把默认值换成对应的字段就行 - 如果是用JavaScript,把类型定义去掉就行,逻辑完全一样
flatMap是ES6+的方法,要是需要兼容旧环境,可以用map加concat来替代,比如把flatMap换成map(...).reduce((acc, curr) => acc.concat(curr), [])
内容的提问来源于stack exchange,提问作者Bhachi Kumar
相关产品推荐
相关产品推荐

