1 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
思路
應(yīng) @angularbaby 要求添加說(shuō)明。
首先很容易想到的是一個(gè)查找表(映射表),而 JS 里最簡(jiǎn)單的映射表就是 JS 對(duì)象。
從題主提供的 config 來(lái)看,是多個(gè)鍵對(duì)應(yīng)同一個(gè)映射目標(biāo),多組這樣的對(duì)應(yīng)關(guān)系。而需要的結(jié)果是一對(duì)一的對(duì)應(yīng)關(guān)系,所以很容易想到,將多對(duì)一關(guān)系拆分成多個(gè)一對(duì)一關(guān)系。
所以下面的代碼就干了兩件事情,① 將原來(lái)的一個(gè) Key 拆分成多個(gè) Key,生成一對(duì)一關(guān)系的映射表;② 提供一個(gè)查詢函數(shù),在生成的映射表中查詢結(jié)果。
代碼及演示
const a = (config => {
const map = Object.keys(config)
// 對(duì)原有 config 的 Key(list) 進(jìn)行逐個(gè)聚合處理
// 初始值是一個(gè)空映射表(空對(duì)象)
// 每次聚合過(guò)程會(huì)添加若干鍵值對(duì),鍵不同,值相同
.reduce((dict, keys) => {
// 緩存目標(biāo)值,即標(biāo)準(zhǔn)的 year、month 等
const target = config[keys];
// 拆分 key(list),逐個(gè)將每個(gè) key 添加到映射表中
keys.split("|").forEach(key => dict[key] = target);
return dict;
}, {});
// 反回一個(gè)查詢函數(shù),它只是簡(jiǎn)單的返回映射表中的查詢值
return function(key) {
return map[key];
};
})({
"年|year|nian": "year",
"月|month|yue": "month"
});
可改進(jìn)之處
現(xiàn)在這個(gè)處理沒有考慮 config 更新的情況,但這個(gè)不是主要問(wèn)題。主要問(wèn)題是沒有容錯(cuò),如果調(diào)用 a() 的時(shí)候,沒有找到相應(yīng)的 key,會(huì)返回 undefined,這個(gè)可以按實(shí)際需求對(duì)返回值進(jìn)行處理,比如
假設(shè)未查詢,要求返回原值,那么可以將查詢函數(shù)修改為
return map[key] || key;
添加回答
舉報(bào)