背景

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

时间   类别   费用
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号只有电费,连水费这一行数据都没有,因此在转换成功后,特意检测了是否存在这样的情况,如果存在,则设置默认值。

    /* json数据行列转换
* @jsonData json数据源
* @idField 条件字段
* @colField 生成列名的字段
* @valueField 生成值的字段
* @emptyValue 默认值 避免有些数据不全
*/
function row2col(jsonData, idField, colField, valueField, emptyValue) {
var result = [], //存储返回的数据
idIndexData = {},//存储id在数组中的信息(位置)
resultColumns = {},//存储列名数据
curRecord = null;//存储当前数据 var colFields = colField.split(','); // // 循环整个JSON数组:[{...},{...},{...},...]
for (var idx = ; idx < jsonData.length; idx++) { //当前json数据对象
var cdata = jsonData[idx]; //根据主键值,查找到结果数组中的索引号
var idValue = cdata[idField];
var num = idIndexData[idValue];//获取存储该id的数组索引号
if (num != null) {
curRecord = result[num];
} else {
//初始化数据时保持完整的结构信息 避免因为缺乏数据,缺乏指定的列数据
curRecord = {};
} // 指定的colFields列下的数据作为y轴,则取出该列的数据作为y轴即可
for (var i in colFields) {
var key = colFields[i]; //获取到colField的值,作为列名
var value = cdata[valueField];
curRecord[value] = cdata[key]; //存储列名
resultColumns[value] = null;
break;
} //除数据内容外,还需要添加主键数据
curRecord[idField] = idValue; //对象若为新建 则新增进数组
if (num == null) {
idIndexData[idValue] = result.push(curRecord) - ;
}
} //数据检查 由于是将行数据作为列名,则可能会存在部分行缺少其他列数据,若缺少,则指定默认值
for (var i in result) {
for (var name in resultColumns) {
if (!result[i].hasOwnProperty(name)) result[i][name] = emptyValue;
}
}
return result;
}

  

完整示例下载

JSON数据行转列的应用的更多相关文章

  1. Sql server 中将数据行转列列转行(二)

    老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...

  2. SQL两列数据,行转列

    SQL中只有两列数据(字段1,字段2),将其相同字段1的行转列 转换前: 转换后: --测试数据 if not object_id(N'Tempdb..#T') is null drop table ...

  3. Mysql或者Hive数据行变成列

    对于mysql /  hive 再进行统计的时候假设须要行变成列,能够使用函数 CASE 字段a WHEN 值b THEN c [WHEN d THEN e]* [ELSE f] END 当字段a=值 ...

  4. Sql server 中将数据行转列列转行(一)

    在做一些数据分析与数据展示时,经常会遇到行转列,列转行的需求,今天就来总结下: 在开始之前,先来创建一个临时表,并且写入一些测试数据: /* 第一步:创建临时表结构 */ CREATE TABLE # ...

  5. Oracle数据 行转列

    记录一段行转列SQL代码: select cs.standard_id,cs.area_code,cs.exu_dept, regexp_substr(exu_dept, , level) as de ...

  6. C#读txt文件并写入二维数组中(txt数据行,列未知)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  7. sql数据行转列

    select CodeName FROM CodeDictionary where CodeCategory_ID=138结果: ) GROUP BY CodeName SET @sql='selec ...

  8. 大数据学习day28-----hive03------1. null值处理,子串,拼接,类型转换 2.行转列,列转行 3. 窗口函数(over,lead,lag等函数) 4.rank(行号函数)5. json解析函数 6.jdbc连接hive,企业级调优

    1. null值处理,子串,拼接,类型转换 (1) 空字段赋值(null值处理) 当表中的某个字段为null时,比如奖金,当你要统计一个人的总工资时,字段为null的值就无法处理,这个时候就可以使用N ...

  9. 用JSON数据向已定义列的表格添加数据行

    其实添加方式和在MVC中动态读取JSON数据创建表格一样,只不过一个是完整表格添加,一个是从表格中间添加.不详细说明了. <div> <table class="table ...

随机推荐

  1. MVC 添加 httpHandlers 支持 .aspx 页面访问

    <?xml version="1.0"?> <!-- For more information on how to configure your ASP.NET ...

  2. ooj1057: M的整数倍DP

    http://121.249.217.157/JudgeOnline/problem.php?id=1057 1057: M的整数倍 时间限制: 1 Sec  内存限制: 64 MB提交: 130   ...

  3. 在jsp中重复定义了两个相同id的标签导致的错误

    jQuery做前台开发的程序有一个页面在IE11和谷歌浏览器下都没有问题,但是在XP的IE8下运行就报错: 后来发现是定义了两个相同id的标签所致. 在icCard.jsp中定义的标签: 在carIn ...

  4. arcgis server账号需要设置地图缓存的访问权限

    如果gis服务起不来,那么可以看看arcgis server账号有没有设置地图缓存的访问权限,有可能arcgis server账号没有这个文件夹的访问权限.  本文用菊子曰发布

  5. Mac 安装 home Brew以及 XCTool的过程记录

    一.HomeBrew相关: 先对HomeBrew做一个简单的介绍吧,之前了解的也不多. 主要就是用于安装Unix的工具包. 注意:HomeBrew依赖于Xcode的 Command Line Tool ...

  6. IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)

    转自 http://blog.csdn.net/zzfsuiye/article/details/8251060 概述: 在iOS6之前的版本中,通常使用 shouldAutorotateToInte ...

  7. mybatis 3.2.3 maven dependency pom.xml 配置

    <dependency>      <groupId>org.mybatis</groupId>      <artifactId>mybatis< ...

  8. Scala 深入浅出实战经典 第75讲:模式匹配下的For循环

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  9. ECshop 怎样修改商品详细页的“浏览次数”

    怎样修改商品详细页的“浏览次数” 最好可以修改为成倍增加的,比如客户浏览了一次,显示的是20次. 修改 goods.php  文件的下面这行代码即可 $db->query('UPDATE ' . ...

  10. 【C#】取得并改变图像解析度

    , , bmpOrg.Width, bmpOrg.Height);       g.Dispose();       // 画像を保存       string dirName = Path.GetD ...