如何按条件格式化嵌套JSON数组以生成API请求JSON
解决嵌套数组转API请求数组的问题
我来帮你搞定这个嵌套数组的转换需求!你遇到的for循环重复问题,其实可以通过数组的高阶方法(filter、flatMap、map)来优雅解决,同时精准满足你列出的所有规则。
核心处理逻辑
先把你提到的规则对应到代码步骤:
- 规则1:过滤掉没有
timings或timings为空的days - 规则2:对每个有效day,过滤掉
blocks/floors/rooms为空的timings - 规则3:如果某个timing的
breaks为空,就不携带这个字段 - 规则4:处理breaks时,根据
mode值保留对应字段:mode: false→ 只保留duration和quantitymode: true→ 只保留startTime和endTime
- 规则5:把嵌套结构展开成一维数组
代码实现(JavaScript/TypeScript)
假设你的前端嵌套数组是frontendDays,转换函数如下:
function transformToApiFormat(frontendDays) { return frontendDays // 规则1:过滤无有效timings的days .filter(day => day.timings && day.timings.length > 0) .flatMap(day => { // 规则2:过滤当前day下无效的timings const validTimings = day.timings.filter(timing => { return timing.blocks?.length > 0 && timing.floors?.length > 0 && timing.rooms?.length > 0; }); return validTimings.map(timing => { // 基础字段:提取timing里的有效内容(比如dayId、blocks、floors等,根据你的实际字段调整) const apiTiming = { dayId: day.id, // 假设day里有id字段,用来标识是哪一天 blocks: timing.blocks, floors: timing.floors, rooms: timing.rooms, // 其他timing级别的必填字段... }; // 规则3:处理breaks,为空则不添加该字段 if (timing.breaks && timing.breaks.length > 0) { apiTiming.breaks = timing.breaks.map(brk => { // 规则4:根据mode筛选字段 if (brk.mode === false) { return { duration: brk.duration, quantity: brk.quantity }; } else { return { startTime: brk.startTime, endTime: brk.endTime }; } }); } return apiTiming; }); }); }
示例验证
举个你提到的场景例子:
前端输入示例(简化版)
const frontendDays = [ { id: "day-1", timings: [ { blocks: [1], floors: [2], rooms: [3], breaks: [{ mode: false, duration: 30, quantity: 1 }] }, { blocks: [], floors: [2], rooms: [3], breaks: [] }, // 规则2会过滤 { blocks: [1], floors: [2], rooms: [3], breaks: [] } // 规则3不会带breaks字段 ] }, { id: "day-3", timings: [] // 规则1会过滤 } ];
转换后的API请求数组
[ { dayId: "day-1", blocks: [1], floors: [2], rooms: [3], breaks: [{ duration: 30, quantity: 1 }] }, { dayId: "day-1", blocks: [1], floors: [2], rooms: [3] // 无breaks字段 } ]
为什么不用for循环?
数组的高阶方法(filter/flatMap/map)本身就是为了处理这类集合转换场景,避免手动维护索引和临时数组,自然不会出现重复问题。如果是Angular项目,TypeScript的类型系统还能帮你更精准地定义字段类型,减少出错概率。
内容的提问来源于stack exchange,提问作者Runali
相关产品推荐
相关产品推荐

