1 回答

TA贡献1876条经验 获得超7个赞
思路
应 @angularbaby 要求添加说明。
首先很容易想到的是一个查找表(映射表),而 JS 里最简单的映射表就是 JS 对象。
从题主提供的 config 来看,是多个键对应同一个映射目标,多组这样的对应关系。而需要的结果是一对一的对应关系,所以很容易想到,将多对一关系拆分成多个一对一关系。
所以下面的代码就干了两件事情,① 将原来的一个 Key 拆分成多个 Key,生成一对一关系的映射表;② 提供一个查询函数,在生成的映射表中查询结果。
代码及演示
const a = (config => {
const map = Object.keys(config)
// 对原有 config 的 Key(list) 进行逐个聚合处理
// 初始值是一个空映射表(空对象)
// 每次聚合过程会添加若干键值对,键不同,值相同
.reduce((dict, keys) => {
// 缓存目标值,即标准的 year、month 等
const target = config[keys];
// 拆分 key(list),逐个将每个 key 添加到映射表中
keys.split("|").forEach(key => dict[key] = target);
return dict;
}, {});
// 反回一个查询函数,它只是简单的返回映射表中的查询值
return function(key) {
return map[key];
};
})({
"年|year|nian": "year",
"月|month|yue": "month"
});
可改进之处
现在这个处理没有考虑 config 更新的情况,但这个不是主要问题。主要问题是没有容错,如果调用 a() 的时候,没有找到相应的 key,会返回 undefined,这个可以按实际需求对返回值进行处理,比如
假设未查询,要求返回原值,那么可以将查询函数修改为
return map[key] || key;
添加回答
举报