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

如何按条件格式化嵌套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和quantity
    • mode: 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:58:08