在业务开发中,我们常常会使用对象定义一些 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)
首先考虑入参的格式。显然作为原始数据,入参必须能够包含完整的字典信息,包括键,值,所有扩展字段,甚至列表场景中的展示顺序。出参应该是一个对象,包含多种格式的字典。