摘要:现有一堆数据,我需要按时间进行分组,以便前端视图呈现需转化为如下原始方法,网络一大堆遍历原始数组如果没有则在新中添加遍历如查找到符合则添加跳出循环运行效率遍历个约,总觉得不优雅,而且没用到的特性,于是
现有一堆数据,我需要按时间进行分组,以便前端视图呈现
[ {"date":"2017-12-22","start_time":"10:00:00","end_time":"10:00:00","status":"Performance Time"}, {"date":"2017-12-22","start_time":"10:40:00","end_time":"10:40:00","status":"Performance Time"}, {"date":"2017-12-23","start_time":"10:00:00","end_time":"10:00:00","status":"Performance Time"}, {"date":"2017-12-23","start_time":"10:40:00","end_time":"10:40:00","status":"Performance Time"} ]
需转化为如下
[ { date: "2017-12-22", data: [ { date: "2017-12-22", start_time: "10:00:00", end_time: "10:00:00", status: "Performance Time" }, { date: "2017-12-22", start_time: "10:40:00", end_time: "10:40:00", status: "Performance Time" } ] }, { date: "2017-12-23", data: [ { date: "2017-12-23", start_time: "10:00:00", end_time: "10:00:00", status: "Performance Time" }, { date: "2017-12-23", start_time: "10:40:00", end_time: "10:40:00", status: "Performance Time" } ] } ]1.原始方法,网络一大堆
var map = {}, nList = [] //遍历原始数组 for (var i = 0; i < arr.length; i++) { var item = arr[i] //如果map没有则在新nList中添加 if (!map[item.date]) { nList.push({ date: item.date, data: [item] }) map[item.date] = item } else { //遍历nList for (var j = 0; j < nList.length; j++) { var nItem = nList[j]、 //如查找到date符合则添加 if (nItem.date == item.date) { nItem.data.push(item) //跳出循环 break } } } }
运行效率:遍历1000个约3ms,总觉得不优雅,而且没用到ES5的特性,于是决定自己优化一下!
2.使用ES5特性将for替换为forEach和every
let map = {}, nList = [] arr.forEach((item) => { if (!map[item.date]) { nList.push({ date: item.date, data: [item] }) map[item.date] = item } else { //因为forEach不支持break,所以使用every实现 nList.every((nItem) => { if (nItem.date === item.date) { nItem.data.push(item) return false } return true }) } })
性能优化50%,约1.5ms!
3.性能优化实践因为我的数组中的date是按顺序排列,而且没有重复,这样可以考虑去除第二个循环
let map = {}, nList = [] //设置初始key为0 let _nkey = 0 arr.forEach((item, index) => { if (index === 0) { nList.push({ date: item.date, data: [item] }) } else { let oItem = arr[index - 1] //和前一个date一致则在当前添加,否则添加至nList if (item.date === oItem.date) { nList[_nkey]["data"].push(item) } else { nList.push({ date: item.date, data: [item] }) _nkey ++ } } })
效率再次优化50%,约1ms!
项目最终效果:文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/92298.html
摘要:序列化为字符串之后它的各个属性已经被解除了引用,重新相当于创建了一个新的对象。类似于的,的命令行终端。基本思路函数的使用以及协议。 多行注释的陷阱 由于正则表达式字面量的存在,多行注释可能会产生陷阱,例如以下程序将抛出错误: /* var a = /h*/.test(hello); */ 正则结束前的那个星号将被解析为注释结束符,从而.被认为是不合法的.所以尽量避免使用多行注释 整型 ...
摘要:当执行上下文被创建时,它的作用域链初始化为当前运行函数的属性中的对象。该过程搜索执行环境的作用域链,查找同名的标识符。搜索实例成员比从字面量或局部变量中读取数据代价更高,再加上遍历原型链带来的开销,这让性能问题更为严重。 最近在阅读这本Nicholas C.Zakas(javascript高级程序设计作者)写的最佳实践、性能优化类的书。记录下主要知识。 加载和执行 脚本位置 放在中的...
摘要:当执行上下文被创建时,它的作用域链初始化为当前运行函数的属性中的对象。该过程搜索执行环境的作用域链,查找同名的标识符。搜索实例成员比从字面量或局部变量中读取数据代价更高,再加上遍历原型链带来的开销,这让性能问题更为严重。 最近在阅读这本Nicholas C.Zakas(javascript高级程序设计作者)写的最佳实践、性能优化类的书。记录下主要知识。 加载和执行 脚本位置 放在中的...
阅读 2555·2021-09-22 15:25
阅读 2962·2021-09-14 18:03
阅读 1211·2021-09-09 09:33
阅读 1699·2021-09-07 09:59
阅读 2930·2021-07-29 13:50
阅读 1500·2019-08-30 15:44
阅读 1715·2019-08-29 16:22
阅读 1287·2019-08-29 12:49