JSON数据行转列的应用
背景
先说说为什么要弄什么行转列。
时间 | 类别 | 费用 |
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数据行转列的应用的更多相关文章
- Sql server 中将数据行转列列转行(二)
老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...
- SQL两列数据,行转列
SQL中只有两列数据(字段1,字段2),将其相同字段1的行转列 转换前: 转换后: --测试数据 if not object_id(N'Tempdb..#T') is null drop table ...
- Mysql或者Hive数据行变成列
对于mysql / hive 再进行统计的时候假设须要行变成列,能够使用函数 CASE 字段a WHEN 值b THEN c [WHEN d THEN e]* [ELSE f] END 当字段a=值 ...
- Sql server 中将数据行转列列转行(一)
在做一些数据分析与数据展示时,经常会遇到行转列,列转行的需求,今天就来总结下: 在开始之前,先来创建一个临时表,并且写入一些测试数据: /* 第一步:创建临时表结构 */ CREATE TABLE # ...
- Oracle数据 行转列
记录一段行转列SQL代码: select cs.standard_id,cs.area_code,cs.exu_dept, regexp_substr(exu_dept, , level) as de ...
- C#读txt文件并写入二维数组中(txt数据行,列未知)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- sql数据行转列
select CodeName FROM CodeDictionary where CodeCategory_ID=138结果: ) GROUP BY CodeName SET @sql='selec ...
- 大数据学习day28-----hive03------1. null值处理,子串,拼接,类型转换 2.行转列,列转行 3. 窗口函数(over,lead,lag等函数) 4.rank(行号函数)5. json解析函数 6.jdbc连接hive,企业级调优
1. null值处理,子串,拼接,类型转换 (1) 空字段赋值(null值处理) 当表中的某个字段为null时,比如奖金,当你要统计一个人的总工资时,字段为null的值就无法处理,这个时候就可以使用N ...
- 用JSON数据向已定义列的表格添加数据行
其实添加方式和在MVC中动态读取JSON数据创建表格一样,只不过一个是完整表格添加,一个是从表格中间添加.不详细说明了. <div> <table class="table ...
随机推荐
- JS open App(未安装就跳转下载页面)
直接上代码var APPCommon = { downAppURl : "http://**/",//下载APP地址 downWeixin: "http://**&quo ...
- .NET开发中经常用到的扩展方法
整理一下自己经常用到的几个扩展方法,在实际项目中确实好用,节省了不少的工作量. 1 匿名对象转化 在WinForm中,如果涉及较长时间的操作,我们一般会用一个BackgroundWorker来做封装 ...
- jquery判断checkbox是否选中及改变checkbox状态(转)
jquery判断checked的三种方法:.attr('checked): //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或false.prop('c ...
- 多看Kindle的“导出失败,请检查网络或账号”错误的解决
一直都用得好好的,今天突然不行了,报错“导出失败,请检查网络或账号”. 网上搜索,试了一下这个方法: 我目前的解决办法是:先同步至小米账户(需要联网,并在Kindle系统设置 -> 阅读 -&g ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)
一.前提: 完成Hello Game项目的创建编译. 具体参考:Cocos2dx.3x_Hello Game项目创建篇 二.本篇目标: l 说说关于塔防游戏的想法和思路 l 实现一个简单的塔防游戏 ...
- 小白学数据分析----->ARPPU的误区
新年到来,该应该持续坚持写下去,还是有很多人要来学习和进步的. 今天提到了一个概念:ARPPU. 这个概念等同于之前大家认识的ARPU(其实这句话我是很不愿意说的),ARPPU是总收入除以总付费用户数 ...
- 软件设计之UML—UML中的六大关系
一.UML中的六大关系 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation), ...
- MySQL 学习用employee数据库表参考使用
download place:https://launchpad.net/test-db/ ,choose this file from the right panel:employees_db-fu ...
- Linux--Ubuntu12.04安装NDK
前言 本篇博客将介绍如何在Ubuntu12.04下安装Android NDK,在其他版本的Ubuntu下,方法也类似.由于Android NDK不能单独作为Android应用程序来运行,因此,使用An ...
- HLS视频点播&直播初探
前端可选的视频直播协议大致只有两种: RTMP(Real Time Messaging Protocol) HLS(HTTP Live Streaming) 其中RTMP是Adobe开发的协议,无法在 ...