Javascript中JSON数据分组优化实践及JS操作JSON总结


Posted in Javascript onDecember 22, 2017

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

[
 {"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包版本太低。



Javascript 相关文章推荐
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
uploadify 3.0 详细使用说明
Jun 18 Javascript
封装了jQuery的Ajax请求全局配置
Feb 05 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
Mar 02 Javascript
利用python分析access日志的方法
Oct 26 Javascript
微信小程序实现简单input正则表达式验证功能示例
Nov 30 Javascript
js+SVG实现动态时钟效果
Jul 14 Javascript
vue-router两种模式区别及使用注意事项详解
Aug 01 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
Nov 09 Javascript
javascript数组的定义及操作实例
Nov 10 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
nestjs中异常过滤器Exceptionfilter的具体使用
Feb 07 Javascript
vue init失败简单解决方法(终极版)
Dec 22 #Javascript
使用axios实现上传图片进度条功能
Dec 21 #Javascript
详解使用webpack构建多页面应用
Dec 21 #Javascript
使用ajax的post同步执行(实现方法)
Dec 21 #Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 #jQuery
原生js+cookie实现购物车功能的方法分析
Dec 21 #Javascript
JS实现去除数组中重复json的方法示例
Dec 21 #Javascript
You might like
PHP脚本的10个技巧(4)
2006/10/09 PHP
php的sso单点登录实现方法
2015/01/08 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
PHP7内核之Reference详解
2019/03/14 PHP
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
使用console进行性能测试
2015/04/27 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
vue给组件传递不同的值方法
2018/09/29 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
python requests库的使用
2021/01/06 Python
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
运动会通讯稿500字
2014/02/20 职场文书
企业员工薪酬方案
2014/06/04 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
家电创业计划书
2019/08/05 职场文书
实例详解Python的进程,线程和协程
2022/03/13 Python
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers