JavaScript中车辆数据双向(可逆)转换函数实现方案问询
车辆数据双向转换器实现方案
核心设计思路
采用映射规则驱动的双向转换模式,将字段映射、转换逻辑、枚举映射统一抽象为可复用的规则单元,通过run和runInverse分别执行正向(供应商→内部)和逆向(内部→供应商)转换,确保转换逻辑的一致性与可逆性。
关键组件设计
1. 映射规则定义
用fromPathTo风格的规则声明字段双向关系,支持三类规则:
- 基础字段映射:直接关联源路径与目标路径
- 自定义转换函数:绑定正向/逆向转换逻辑
- 枚举映射:定义双向枚举对应关系
示例规则结构:
const mappingRules = [ // 基础字段映射 { from: 'supplier.carId', to: 'internal.vehicle_id' }, // 带自定义转换的字段 { from: 'supplier.productionDate', to: 'internal.manufacture_date', transform: (val) => new Date(val).toISOString(), // 正向:字符串转ISO日期 inverseTransform: (val) => new Date(val).toLocaleDateString() // 逆向:ISO日期转本地字符串 }, // 枚举映射 { from: 'supplier.carType', to: 'internal.vehicle_type', enumMap: { forward: { 'SEDAN': 'sedan', 'SUV': 'suv' }, // 供应商→内部 reverse: { 'sedan': 'SEDAN', 'suv': 'SUV' } // 内部→供应商 } } ];
2. 转换器核心类实现
封装VehicleConverter类,核心方法处理转换逻辑,辅助方法解析/设置对象路径:
class VehicleConverter { constructor(rules) { this.rules = rules; } // 按路径获取对象字段值 getValue(obj, path) { return path.split('.').reduce((acc, key) => acc?.[key], obj); } // 按路径设置对象字段值 setValue(obj, path, value) { const keys = path.split('.'); const lastKey = keys.pop(); const parent = keys.reduce((acc, key) => acc[key] || (acc[key] = {}), obj); parent[lastKey] = value; return obj; } // 正向转换:供应商格式→内部API格式 run(supplierData) { const internalData = {}; this.rules.forEach(rule => { const sourceVal = this.getValue(supplierData, rule.from); let targetVal = sourceVal; // 应用自定义转换或枚举映射 if (rule.transform) { targetVal = rule.transform(sourceVal); } else if (rule.enumMap?.forward) { targetVal = rule.enumMap.forward[sourceVal] || sourceVal; } this.setValue(internalData, rule.to, targetVal); }); return internalData; } // 逆向转换:内部API格式→供应商格式 runInverse(internalData) { const supplierData = {}; this.rules.forEach(rule => { const sourceVal = this.getValue(internalData, rule.to); let targetVal = sourceVal; // 应用逆向自定义转换或枚举映射 if (rule.inverseTransform) { targetVal = rule.inverseTransform(sourceVal); } else if (rule.enumMap?.reverse) { targetVal = rule.enumMap.reverse[sourceVal] || sourceVal; } this.setValue(supplierData, rule.from, targetVal); }); return supplierData; } }
3. 使用示例
// 初始化转换器 const converter = new VehicleConverter(mappingRules); // 正向转换:导入供应商数据 const supplierInput = { carId: 'SUPP-123', productionDate: '2023-10-01', carType: 'SUV' }; const internalOutput = converter.run(supplierInput); // 输出:{ vehicle_id: 'SUPP-123', manufacture_date: '2023-10-01T00:00:00.000Z', vehicle_type: 'suv' } // 逆向转换:导出内部数据 const internalInput = { vehicle_id: 'SUPP-123', manufacture_date: '2023-10-01T00:00:00.000Z', vehicle_type: 'suv' }; const supplierOutput = converter.runInverse(internalInput); // 输出:{ carId: 'SUPP-123', productionDate: '10/1/2023', carType: 'SUV' }
扩展功能建议
- 批量转换:判断输入是否为数组,循环处理每个元素实现批量转换
- 规则校验:添加规则合法性检查,确保路径格式正确、自定义转换函数成对存在
- 默认值处理:允许在规则中定义
defaultValue,源字段为空时自动填充 - 嵌套对象批量映射:支持嵌套对象的整体映射,减少规则声明量
内容的提问来源于stack exchange,提问作者Solon
相关产品推荐
相关产品推荐

