javascript - 效能優化的問題
高洛峰
高洛峰 2017-07-05 10:54:21
0
6
1007


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


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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(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
女神的闺蜜爱上我

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

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

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板