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

如何简化JavaScript数据重组函数中的多条件判断?

优化多级表格数据转换函数,减少重复代码

原始数据

let data = [
    {
      managerName: "Surendher",
      advisorName: "Kamal",
      clientName: "Shaadi",
      clients: ["client1", "client2"],
    },
    {
      managerName: "Suresh",
      advisorName: "Kamal",
      clientName: "Nikolai",
      clients: ["client3", "client4"],
    },
    {
      managerName: "LN",
      advisorName: "Ravi",
      clients: ["client5"],
    },
  ];

目标结构

[
  {
    "advisorName": "Kamal",
    "managerName": "Surendher",
    "clientName": "Shaadi",
    "subRows": [
      {
        "clientName": "",
        "managerName": "",
        "advisorName": "",
        "client": "client1"
      },
      {
        "clientName": "",
        "managerName": "",
        "advisorName": "",
        "client": "client2"
      }
    ]
  },
  {
    "advisorName": "Kamal",
    "managerName": "Suresh",
    "clientName": "Nikolai",
    "subRows": [
      {
        "clientName": "",
        "managerName": "",
        "advisorName": "",
        "client": "client3"
      },
      {
        "clientName": "",
        "managerName": "",
        "advisorName": "",
        "client": "client4"
      }
    ]
  },
  {
    "advisorName": "Ravi",
    "managerName": "LN",
    "client": "client5"
  }
]

原代码问题

原转换函数存在大量冗余逻辑:

  • 多次重复判断managerName、advisorName的存在性,生成高度相似的对象结构
  • clients长度分支下的逻辑重复度极高,仅差异在是否生成subRows及字段数量

优化方案

通过提取通用逻辑、简化分支判断重构代码,提升可读性与可维护性:

1. 提取通用字段生成函数

  • 主行字段:统一处理原对象中managerName、advisorName、clientName的存在性,仅保留有值的字段
  • 子行字段:固定生成带空字符串层级字段的子行结构,确保格式统一

2. 简化核心转换逻辑

仅通过clients长度区分两种主结构,避免嵌套判断的重复书写

优化后的代码:

// 生成主行的基础字段(仅保留存在的属性)
const getMainRowFields = (item) => {
  const fields = {};
  if (item.managerName) fields.managerName = item.managerName;
  if (item.advisorName) fields.advisorName = item.advisorName;
  if (item.clientName) fields.clientName = item.clientName;
  return fields;
};

// 生成子行的字段结构
const getSubRow = (client) => ({
  managerName: "",
  advisorName: "",
  clientName: "",
  client
});

const res = data.map(item => {
  const mainFields = getMainRowFields(item);
  
  if (item.clients.length > 1) {
    return {
      ...mainFields,
      subRows: item.clients.map(getSubRow)
    };
  } else {
    return {
      ...mainFields,
      client: item.clients[0]
    };
  }
});

console.log(JSON.stringify(res));

优化点说明

  • 消除重复判断:通过getMainRowFields统一处理字段存在性,替代原代码中多次嵌套的三元运算
  • 复用子行逻辑:getSubRow函数确保所有子行格式一致,避免重复书写相同结构
  • 简化分支逻辑:仅通过clients.length区分两种主结构,代码逻辑更清晰
  • 扩展性强:后续新增层级字段时,只需修改getMainRowFields和getSubRow即可,无需改动核心转换逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:54:20