84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
这段代码怎么优化, 老大说 转成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的操作反而提高效率