为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript怎样实现快速映射

JavaScript怎样实现快速映射

慕容3067478 2019-02-14 13:30:00
javascript实现快速映射,类似这样:let config = {    '年|year|nian': 'year',    '月|month|yue': 'month'}function a(type) {    type = config[type]; // 只要type能和映射表某一键值匹配,则能快速映射为另一个值    console.log(type);}a('年');a('month');a('year');这样不用写if else,并且后续维护也比较简单,只要添加或者删除映射表里的映射规则即可下面是我实现的映射方法,但是这样写效率太低了,每次都要遍历,而且都要new一个正则对象let config = {    '年|year|nian': 'year',    '月|month|yue': 'month'};function getType(type) {    let tstr,    treg;    type = type + '';    for (tstr in config) {        treg = new RegExp(tstr, 'g');        if (treg.test(type)) {            return config[tstr];        }    }}
查看完整描述

1 回答

?
幕布斯6054654

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"

});

https://img1.sycdn.imooc.com//5c679ccf0001f30c06410389.jpg


可改进之处

现在这个处理没有考虑 config 更新的情况,但这个不是主要问题。主要问题是没有容错,如果调用 a() 的时候,没有找到相应的 key,会返回 undefined,这个可以按实际需求对返回值进行处理,比如


假设未查询,要求返回原值,那么可以将查询函数修改为


return map[key] || key;


查看完整回答
反对 回复 2019-02-16
  • 1 回答
  • 0 关注
  • 564 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号