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 ...
随机推荐
- paip. uapi 过滤器的java php python 实现aop filter
paip. uapi 过滤器的java php python 实现aop filter filter 是面向切面编程AOP.. 作者Attilax 艾龙, EMAIL:1466519819@qq. ...
- GUID全局唯一标识符相关知识了解
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情 ...
- 《精通移动app测试实战:技术、工具和案例》新书上市
本书是测试专家.性能测试专家.专业畅销书作者--于涌,多年实战经验的总结,涵盖主流的测试工具,包括众多的测试实例,涵盖单元测试.功能测试.性能测试.UI测试.手游测试.自动化测试.测试用例管理.持续集 ...
- ftp如何预览图片 解决方案
下载使用 server-U ,开启 HTTP 服务,输入 http://ip:端口 后,登录ftp账号密码,可选使用 基于java的应用 web client 或 FTP Voyager JV,来预览 ...
- 了解Browserify
Browserify是一个Javascript的库,可以用来把多个Module打包到一个文件中,并且能很好地应对Modules之间的依赖关系.而Module是封装了属性和功能的单元,是一个Javasc ...
- 如何实现在H5里调起高德地图APP?(上)
这一篇文章,将讲述如何在H5里调起高德地图APP,并展示兴趣点.适合于展示某个餐馆,商场等,让用户自行选择前往方式. 场景一.在高德地图上展示Marker点或者POI标记 在一些基于位置分享的应用开发 ...
- Explain in detail the steps/processes that occur from the moment you type a URL in a browser and hit enter
In an extremely rough and simplified sketch, assuming the simplest possible HTTP request, no proxies ...
- Lucene 4.X 倒排索引原理与实现: (1) 词典的设计
词典的格式设计 词典中所保存的信息主要是三部分: Term字符串 Term的统计信息,比如文档频率(Document Frequency) 倒排表的位置信息 其中Term字符串如何保存是一个很大的问题 ...
- SMON功能(一):清理临时段
温故而知新 SMON功能(一) SMON(system monitor process)系统监控后台进程,有时候也被叫做system cleanup process,这么叫的原因是它负责完成很多清理( ...
- puppy-language
puppy language是一种解释型的结构化脚本语言. 项目地址: https://github.com/zlvb/PuppyLanguage 因为一直很忙,有段时间没去更新了,不过功能已经比较完 ...