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 相关文章推荐
range 标准化之获取
Aug 28 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
Jan 10 Javascript
js判断文本框剩余可输入字数的方法
Feb 04 Javascript
javascript实现删除前弹出确认框
Jun 04 Javascript
javascript下使用Promise封装FileReader
Feb 19 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
May 09 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
Jul 24 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
移动端效果之IndexList详解
Oct 20 Javascript
vue使用监听实现全选反选功能
Jul 06 Javascript
浅谈一种让小程序支持JSX语法的新思路
Jun 16 Javascript
JavaScript实现轮播图片完整代码
Mar 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代码的53条建议
2008/03/27 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
JavaScript实用技巧(一)
2010/08/16 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
NodeJS http模块用法示例【创建web服务器/客户端】
2019/11/05 NodeJs
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
python中子类调用父类函数的方法示例
2017/08/18 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
英国门把手公司:Door Handle Company
2019/05/12 全球购物
平面设计师工作职责范文
2013/12/03 职场文书
婚庆公司的创业计划书
2014/01/22 职场文书
岗位廉政承诺书
2014/03/27 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android