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 开天辟地入门篇一
Dec 09 Javascript
JS图片无缝滚动(简单利于使用)
Jun 17 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
Sep 06 Javascript
深入理解Node.js 事件循环和回调函数
Nov 02 Javascript
详解在 Angular 项目中添加 clean-blog 模板
Jul 04 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 Javascript
vue引用js文件的多种方式(推荐)
May 17 Javascript
JS常见构造模式实例对比分析
Aug 27 Javascript
vue项目中跳转到外部链接的实例讲解
Sep 20 Javascript
Vue CLI3基础学习之pages构建多页应用
Jun 02 Javascript
vue获取data数据改变前后的值方法
Nov 07 Javascript
vue.js实现双击放大预览功能
Jun 23 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 编程请选择正确的文本编辑软件
2006/12/21 PHP
php格式化json函数示例代码
2016/05/12 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
深入理解vue-class-component源码阅读
2019/02/18 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
详解Python中的四种队列
2018/05/21 Python
Python版名片管理系统
2018/11/30 Python
python构建基础的爬虫教学
2018/12/23 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
简单了解python关系(比较)运算符
2019/07/08 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
Python 可视化神器Plotly详解
2020/12/26 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
房地产开盘策划方案
2014/02/10 职场文书
共产党员承诺书
2014/03/25 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
软件测试专业推荐信
2014/09/18 职场文书
小学班主任评语
2014/12/29 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript