本文详解如何在 Angular 项目中将深层嵌套的对象(含多层子对象和数组)转换为符合后端接口要求的扁平化 JSON 结构,重点解决 locationList 提升、ContactData.contactList 提取等常见数据整形需求。
本文详解如何在 angular 项目中将深层嵌套的对象(含多层子对象和数组)转换为符合后端接口要求的扁平化 json 结构,重点解决 `locationlist` 提升、`contactdata.contactlist` 提取等常见数据整形需求。
在 Angular 表单提交场景中,前端常需对原始表单对象(如 FormGroup.value)进行结构重塑,以适配后端 API 的契约规范。如题所示,原始数据中 locationData 是一个包含 locationList 数组的对象,而每个 locationList 项又嵌套了 ContactData.contactList;目标格式则要求:
首先定义清晰的 TypeScript 接口,提升可维护性与 IDE 支持:
interface BioData { firstName?: string; lastName?: string;}interface ContactItem { phone?: string; extension?: string;}interface LocationData { address1?: string; address2?: string; contactList?: ContactItem[];}interface SubmitPayload { bioData: BioData; locationData: LocationData[];}
⚠️ 注意:所有字段设为可选(?),避免初始化负担;实际使用时可通过 strictNullChecks 配合校验确保必填字段非空。
接着,使用不可变方式构建目标结构(推荐在 service 或提交前的 transform 方法中调用):
function transformFormData(source: any): SubmitPayload { return { bioData: { firstName: source.BioData?.firstname, lastName: source.BioData?.lastName, }, locationData: (source.locationData?.locationList || []).map((loc: any) => ({ address1: loc.address1, address2: loc.address2, contactList: (loc.ContactData?.contactList || []) as ContactItem[], })), };}// 使用示例const rawFormValue = { /* 原始嵌套数据 */ };const payload = transformFormData(rawFormValue);console.log(JSON.stringify(payload, null, 2));
最终生成的 JSON 完全符合目标格式——结构清晰、语义明确、零冗余嵌套,既满足后端解析要求,也利于前端后续状态管理与错误定位。