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 相关文章推荐
JavaScript代码复用模式实例分析
Dec 02 Javascript
jquery select多选框的左右移动 具体实现代码
Jul 03 Javascript
简单的jquery左侧导航栏和页面选中效果
Aug 21 Javascript
9款2014最热门jQuery实用特效推荐
Dec 07 Javascript
JQuery创建DOM节点的方法
Jun 11 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
Jan 06 Javascript
javascript实现随机生成DIV背景色
Jun 20 Javascript
实例解析js中try、catch、finally的执行规则
Feb 24 Javascript
AngularJS 支付倒计时功能实现思路
Jun 05 Javascript
Angular6 Filter实现页面搜索的示例代码
Dec 02 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
Oct 30 Javascript
vue 通过base64实现图片下载功能
Dec 19 Vue.js
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游戏编程25个脚本代码
2011/02/08 PHP
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
php数据序列化测试实例详解
2017/08/12 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
详解微信UnionID作用
2019/05/15 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
JavaScript实现alert弹框效果
2020/11/19 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
机器学习10大经典算法详解
2017/12/07 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
证婚人搞笑证婚词
2014/01/10 职场文书
2014的自我评价
2014/01/13 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python