视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Javascript中JSON数据分组优化实践及JS操作JSON总结
2020-11-27 22:23:08 责编:小采
文档


现有一堆数据,我需要按时间进行分组,以便前端视图呈现

[
 {"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!

PS:JS操作JSON总结

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全于语言的文本格式,是理想的数据交换格式。同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包。

    本文主要是对JS操作JSON的要领做下总结。

    在JSON中,有两种结构:对象和数组。

    1. 一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值' 对”之间运用 “,”(逗号)分隔。 名称用引号括起来;值如果是字符串则必须用括号,数值型则不须要。例如: 

var o={"xlid":"cxh","xldigitid":123456,"topscore":2000,"topplaytime":"2009-08-20"};

    2. 数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间运用 “,”(逗号)分隔。

    例如:

 var jsonranklist=[{"xlid":"cxh","xldigitid":123456,"topscore":2000,"topplaytime":"2009-08-20"},{"xlid":"zd","xldigitid":123456,"topscore":1500,"topplaytime":"2009-11-20"}];

    为了方便地处理JSON数据,JSON提供了json.js包,下载地址:http://www.json.org/json.js

    在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键。例如:

    JSON字符串:

 var str1 = '{ "name": "cxh", "sex": "man" }';

    JSON对象:   

 var str2 = { "name": "cxh", "sex": "man" };

    一、JSON字符串转换为JSON对象

    要运用上面的str1,必须运用下面的要领先转化为JSON对象:

  //由JSON字符串转换为JSON对象
var obj = eval('(' + str + ')');

或者  

var obj = str.parseJSON(); //由JSON字符串转换为JSON对象

    或者 

 var obj = JSON.parse(str); //由JSON字符串转换为JSON对象

    然后,就可以这样读取:

 Alert(obj.name);
 Alert(obj.sex);

    特别留心:如果obj本来就是一个JSON对象,那么运用 eval()函数转换后(哪怕是多次转换)还是JSON对象,但是运用 parseJSON()函数处理后会有疑问(抛出语法异常)。

    二、可以运用 toJSONString()或者全局要领 JSON.stringify()将JSON对象转化为JSON字符串。

    例如:   

var last=obj.toJSONString(); //将JSON对象转化为JSON字符

    或者

 var last=JSON.stringify(obj); //将JSON对象转化为JSON字符
 alert(last);

    留心:

    上面的多个要领中,除了eval()函数是js自带的之外,其他的多个要领都来自json.js包。新版本的 JSON 修改了 API,将 JSON.stringify() 和 JSON.parse() 两个要领都注入到了 Javascript 的内建对象里面,前者变成了 Object.toJSONString(),而后者变成了 String.parseJSON()。如果提示找不到toJSONString()和parseJSON()要领,则说明您的json包版本太低。



下载本文
显示全文
专题