Heim  >  Fragen und Antworten  >  Hauptteil

Javascript – Probleme bei der Leistungsoptimierung


Wie optimiert man diesen Code? Der Chef sagte, dass er in die ES6-Kartendatenstruktur konvertiert werden sollte und dass er langsamer zu sein scheint

Das ist die Optimierung, die ich vorgenommen habe, sie scheint langsamer zu sein. Bitte geben Sie mir einen Rat

高洛峰高洛峰2663 Tage vor964

Antworte allen(6)Ich werde antworten

  • 習慣沉默

    習慣沉默2017-07-05 10:56:21

    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);
    }

    Antwort
    0
  • 代言

    代言2017-07-05 10:56:21

    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
    

    Antwort
    0
  • 为情所困

    为情所困2017-07-05 10:56:21

    ...

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

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

    Antwort
    0
  • 阿神

    阿神2017-07-05 10:56:21

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

    Antwort
    0
  • 仅有的幸福

    仅有的幸福2017-07-05 10:56:21

    半行代码就搞定

    serviceTypeList.filter(obj => obj.id==*code*)[0].name

    Antwort
    0
  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-07-05 10:56:21

    循环里做filter这个操作本身不慢的。

    什么转成map的方案需要考虑转换本身的开销

    一部分语言自带的map实现,在集合很小的时候用的就是数组,省去了hashcode的操作反而提高效率

    Antwort
    0
  • StornierenAntwort