首頁  >  問答  >  主體

javascript - 效能優化的問題


#這段程式碼怎麼優化, 老大說 轉成ES6的map資料結構,我轉的可能不對好像更慢啦


這是我做的優化,好像更慢了 請大神們指教

高洛峰高洛峰2663 天前967

全部回覆(6)我來回復

  • 習慣沉默

    習慣沉默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);
    }

    回覆
    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
    

    回覆
    0
  • 为情所困

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

    ...

    先轉成鍵值對為name:Id的map結構。然後就可以直接用name去拿對應的id。你完全沒搞懂他給你說的方法的意思。

    先把type數組轉換成map結構,然後透過map.get(code)去拿就好了。不用遍歷。

    回覆
    0
  • 阿神

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

    function中,可以這樣寫
    let result = serviceTypeList.map((val)=> val.typeId === code);
    retVal = result.name;

    回覆
    0
  • 仅有的幸福

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

    半行程式碼就搞定

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

    回覆
    0
  • 女神的闺蜜爱上我

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

    循環裡做filter這個操作本身不慢的。

    什麼轉成map的方案需要考慮轉換本身的開銷

    一部分語言自帶的map實現,在集合很小的時候用的就是數組,省去了hashcode的操作反而提高效率

    回覆
    0
  • 取消回覆