#這段程式碼怎麼優化, 老大說 轉成ES6的map資料結構,我轉的可能不對好像更慢啦
這是我做的優化,好像更慢了 請大神們指教
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
用 filter() 確實可以一句話搞定,但是,效率不高。其實可以用 find (參考 MDN)
filter()
find
function getServiceTypeName(code) { return serviceTypeList.find(val => val.name === code); }
可惜 IE 不支援 find(),所以在 MDN 文件快結束的地方,有一個 Polyfill。
find()
如果說採用 map 來實現,也不需要用 ES6 的 Map,因為原生物件就支援 string 類型的 key,但不管怎麼實現,這個 map 的轉換應該在 getServiceTypeName 之外進行。因為轉換的過程比你寫的 for ... of 更耗時。
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的操作反而提高效率
用
filter()
確實可以一句話搞定,但是,效率不高。其實可以用find
(參考 MDN)可惜 IE 不支援
find()
,所以在 MDN 文件快結束的地方,有一個 Polyfill。如果說採用 map 來實現,也不需要用 ES6 的 Map,因為原生物件就支援 string 類型的 key,但不管怎麼實現,這個 map 的轉換應該在
getServiceTypeName
之外進行。因為轉換的過程比你寫的for ... of
更耗時。objToStrMap初始化一次就可以了,你循環中每次都在初始化,這樣會比較慢。
補充說明
...
先轉成鍵值對為name:Id的map結構。然後就可以直接用name去拿對應的id。你完全沒搞懂他給你說的方法的意思。
先把type數組轉換成map結構,然後透過map.get(code)去拿就好了。不用遍歷。
function中,可以這樣寫
let result = serviceTypeList.map((val)=> val.typeId === code);
retVal = result.name;
半行程式碼就搞定
循環裡做filter這個操作本身不慢的。
什麼轉成map的方案需要考慮轉換本身的開銷
一部分語言自帶的map實現,在集合很小的時候用的就是數組,省去了hashcode的操作反而提高效率