JSON数据行转列的应用 附完整示例下载

开发 前端
费劲的弄出表格,才发现,弄成了每天的水电费,不过是测试数据,不要在意这些细节。很多时候我们就通过sql语句在数据库中查询到如上数据,那么展现到页面的时候,势必要变成下面一种格式。

背景

先说说为什么要弄什么行转列。

时间 类别 费用
2014-07-08 电费 120
2014-07-08      水费 23
2014-07-09 电费 44
2014-07-09 水费 77
2014-07-10 电费 45
2014-07-10 水费 21
2014-07-11 电费 34
2014-07-11 水费 27

 

 

 

 

 

 

 

费劲的弄出表格,才发现,弄成了每天的水电费,不过是测试数据,不要在意这些细节。

很多时候我们就通过sql语句在数据库中查询到如上数据,那么展现到页面的时候,势必要变成下面一种格式。

时间 电费 水费
2014-07-08 120 23
2014-07-08      44 77
2014-07-09 45 66
2014-07-09 43 77
2014-07-10 21 45
2014-07-10 54 21
2014-07-11 65 34
2014-07-11 65 27

 

 

 

 

 

 

 

 

那我们循环来生成table的html吧。

有些善于提问的朋友可能会问到,既然要这样显示,那么可以把电费和水费作为列存储在table中啊。这里不多讨论这个话题,因为中国的收费越来越多,物业费、保护费、税收、天然气等等各种名目......

因此才希望无论费用类别有多少种,都能把它自动转换成列名信息,以表格形式呈现在用户面前。

实现

实现起来很简单,指定主键字段,用来作为列名的字段,值字段,对应上面的实例依次为 "时间",“类别”,"费用"。

主要思路则是,遍历JSON,取到每一行的类别的值,作为列名存储。

这里增加了一个默认值,意在解决数据不完整的问题。

再次用下上面的实例,正确的做法是每天都会对水表和电表进行抄表计算费用,那么万一哪天没写怎么办,那转换后该结构不是不完整了吗,比如2014-07-09号只有电费,连水费这一行数据都没有,因此在转换成功后,特意检测了是否存在这样的情况,如果存在,则设置默认值。

  1. /* json数据行列转换  
  2.      * @jsonData json数据源  
  3.      * @idField  条件字段  
  4.      * @colField 生成列名的字段  
  5.      * @valueField 生成值的字段  
  6.      * @emptyValue 默认值 避免有些数据不全  
  7.     */ 
  8.     function row2col(jsonData, idField, colField, valueField, emptyValue) {  
  9.         var result = [], //存储返回的数据  
  10.             idIndexData = {},//存储id在数组中的信息(位置)  
  11.             resultColumns = {},//存储列名数据  
  12.             curRecord = null;//存储当前数据  
  13.  
  14.         var colFields = colField.split(','); //  
  15.  
  16.         // 循环整个JSON数组:[{...},{...},{...},...]    
  17.         for (var idx = 0; idx < jsonData.length; idx++) {  
  18.  
  19.             //当前json数据对象  
  20.             var cdata = jsonData[idx];  
  21.  
  22.             //根据主键值,查找到结果数组中的索引号  
  23.             var idValue = cdata[idField];  
  24.             var num = idIndexData[idValue];//获取存储该id的数组索引号  
  25.             if (num != null) {  
  26.                 curRecord = result[num];  
  27.             } else {  
  28.                 //初始化数据时保持完整的结构信息 避免因为缺乏数据,缺乏指定的列数据  
  29.                 curRecord = {};  
  30.             }  
  31.  
  32.             // 指定的colFields列下的数据作为y轴,则取出该列的数据作为y轴即可  
  33.             for (var i in colFields) {  
  34.                 var key = colFields[i];  
  35.  
  36.                 //获取到colField的值,作为列名  
  37.                 var value = cdata[valueField];  
  38.                 curRecord[value] = cdata[key];  
  39.  
  40.                 //存储列名  
  41.                 resultColumns[value] = null;  
  42.                 break;  
  43.             }  
  44.  
  45.             //除数据内容外,还需要添加主键数据    
  46.             curRecord[idField] = idValue;  
  47.  
  48.             //对象若为新建 则新增进数组  
  49.             if (num == null) {  
  50.                 idIndexData[idValue] = result.push(curRecord) - 1;  
  51.             }  
  52.         }  
  53.  
  54.         //数据检查 由于是将行数据作为列名,则可能会存在部分行缺少其他列数据,若缺少,则指定默认值  
  55.         for (var i in result) {  
  56.             for (var name in resultColumns) {  
  57.                 if (!result[i].hasOwnProperty(name)) result[i][name] = emptyValue;  
  58.             }  
  59.         }  
  60.         return result;  
  61.     } 

完整示例下载

责任编辑:林师授 来源: 博客园
相关推荐

2021-12-16 22:59:21

SQL报表应用

2021-11-08 23:08:06

SQL Serve数据库开发

2021-06-23 10:13:00

SQL行转列列转行

2010-07-13 16:20:30

SQL Server数

2022-08-11 16:29:32

Tekton流水线迁移工作流

2010-07-28 09:09:55

SQL

2010-11-03 14:28:15

DB2行转列

2011-03-08 13:55:46

2010-07-13 16:07:26

SQL Server行

2018-05-17 10:45:03

大数据分析报告京津冀

2021-10-14 06:51:55

数据库SQL

2023-02-19 15:26:51

深度学习数据集

2010-08-18 13:30:08

Ubuntu 10.0

2011-08-19 14:53:02

SQL ServerDataRelatio

2017-05-27 06:32:36

JSONC代码函数

2020-10-21 09:30:16

Windows 10Windows10月更新

2011-05-20 15:46:45

RubyGemsRuby

2021-07-20 10:59:22

云计算架构示例云应用

2011-03-11 09:11:43

openSUSE 11

2011-12-12 09:22:01

MySQL数据库
点赞
收藏

51CTO技术栈公众号