如何简化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
相关产品推荐
相关产品推荐

