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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:27:26