定义业务字典的映射关系

e3d50dc54f05614904652ada337e8f3a.png

在业务开发中,我们常常会使用对象定义一些 key 和 value 值的映射关系。假设我们正在开发一款打车应用,我们需要定义车型,以便在业务代码中进行业务逻辑判断:

const CAR_TYPE = {
  car_a: 1,
  car_b: 2
}

随着业务逻辑的扩展,简单的枚举值往往会衍生出许多相关联的映射关系。比如,我们需要定义一个车型对应的名称:

const CAR_TYPE_NAMES = {
  [CAR_TYPE.car_a]: '快车',
  [CAR_TYPE.car_b]: '专车'
}

或者需要定义一个车型对应的图标:

const CAR_TYPE_NAMES = {
  [CAR_TYPE.car_a]: 'car_a.png',
  [CAR_TYPE.car_b]: 'car_b.png'
}

这些形态各异的业务字典同时存在会给代码带来重复和混乱。

当我们需要变更或增删某个类型或者类型中的某个值时,需要同时修改多个字典,很容易出现遗漏和错误,尤其是当这些字典定义分布在不同的文件中。

对于使用者来说,散乱的字典定义也是一种负担。在业务中使用某个字典时,需要先查找已有的字典并理解其定义。如果已有字典不能完全满足需求,可能会有新的字典被定义,进一步增加业务字典的混乱程度。

我们可以实现一个工具函数,将一份定义转换成多种格式的字典。

封装方法:

function defineConstants(list) {
  const KV = {}
  const VK = {}
  const LIST = []
  const MAP_BY_KEY = {}
  const MAP_BY_VALUE = {}
  list.forEach(item => {
    KV[item.key] = item.value
    VK[item.value] = item.key
    LIST.push({ ...item })
    MAP_BY_KEY[item.key] = { ...item }
    MAP_BY_VALUE[item.value] = { ...item }
  })
  return { KV, VK, LIST, MAP_BY_KEY, MAP_BY_VALUE }
}

方法的返回结果

{
  KV: { car_a: 1, car_b: 2 },
  VK: { '1': 'car_a', '2': 'car_b' },
  LIST: [
    { key: 'car_a', value: 1, name: '快车', icon: 'car_a.png' },
    { key: 'car_b', value: 2, name: '专车', icon: 'car_b.png' }
  ],
  MAP_BY_KEY: {
    car_a: { key: 'car_a', value: 1, name: '快车', icon: 'car_a.png' },
    car_b: { key: 'car_b', value: 2, name: '专车', icon: 'car_b.png' }
  },
  MAP_BY_VALUE: {
    '1': { key: 'car_a', value: 1, name: '快车', icon: 'car_a.png' },
    '2': { key: 'car_b', value: 2, name: '专车', icon: 'car_b.png' }
  }
}

方法的使用方式

const params = [
  {
    key: 'car_a',
    value: 1,
    name: '快车',
    icon: 'car_a.png'
  },
  {
    key: 'car_b',
    value: 2,
    name: '专车',
    icon: 'car_b.png'
  },
]
const result = defineConstants(params)
console.log(result)

首先考虑入参的格式。显然作为原始数据,入参必须能够包含完整的字典信息,包括键,值,所有扩展字段,甚至列表场景中的展示顺序。出参应该是一个对象,包含多种格式的字典。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值