性能优化的问题

clipboard.png

clipboard.png
这段代码怎么优化, 老大说 转成ES6的map数据结构,我转的可能不对好像更慢啦

clipboard.png
这是我做的优化,好像更慢了 请大神们指教

阅读 3.8k
6 个回答

filter() 确实可以一句话搞定,但是,效率不高。其实可以用 find (参考 MDN)

function getServiceTypeName(code) {
    return serviceTypeList.find(val => val.name === code);
}

可惜 IE 不支持 find(),所以在 MDN 文档快结束的地方,有一个 Polyfill。

如果说采用 map 来实现,也不需要用 ES6 的 Map,因为原生对象就支持 string 类型的 key,但不管怎么实现,这个 map 的转换应该在 getServiceTypeName 之外进行。因为转换的过程比你写的 for ... of 更耗时。

function toMap(list) {
    return list.reduce((map, item) => {
        map.set(item.name, item);
        return map;
    }, new Map());
}

serviceTypeMap = toMap(serviceTypeList);

function getServiceTypeName(code) {
    return serviceTypeMap.get(code);
}

objToStrMap初始化一次就可以了,你循环中每次都在初始化,这样会比较慢。

补充说明

const objToStrMap=function (obj) {
    var myMap=new Map();

    obj.forEach(
        (item) => myMap.set(item.typeId, item.name)
    );

    return myMap;
}
var serviceTypeList=[
    {
        'typeId':1,
        'name':'first'
    },
    {
        'typeId':2,
        'name':'second'
    },
]
function init(){

    serviceTypeList= objToStrMap(serviceTypeList)
}
init();//预先初始化,应用启动前或确保在getServiceTypeName服务调用前已经被初始化完成。

getServiceTypeName=function (code) {

    return serviceTypeList.get(code);
}
console.log(getServiceTypeName(2));  //输出:second

...

先转成键值对为name:Id的map结构。然后就可以直接用name去拿相应的id。你完全没搞懂他给你说的方法的意思。

先把type数组转化成map结构,然后通过map.get(code)去拿就好了。不用遍历。

function中,可以这样写
let result = serviceTypeList.map((val)=> val.typeId === code);
retVal = result.name;

半行代码就搞定

serviceTypeList.filter(obj => obj.id==*code*)[0].name
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题