js实现json数据⾏到列的转换
前⾯实现了Ext动态⽣成图表的功能,满⾜了基本的要求。后⾯⽤户提出这样的问题:有如下的数据:
⽉份                  电量                  单位
201201              33                      郑州
201202              35                      郑州
201203              34                      郑州
201204              36                      郑州
201205              34.3                    郑州
201201              29                      新乡
201202              26                      新乡
201203              27                      新乡
201204              28                      新乡
201205              28.8                    新乡
201201              23                      安阳
201202              25                      安阳
201203              24                      安阳
201204              26                      安阳
201205              24.3                    安阳
预期能够显⽰郑州、安阳、新乡三个序列,但Ext图表本⾝不⽀持把这样的数据显⽰成三个图表序列:如果X轴选⽉份,y轴选电量,就会显⽰成三遍201201—201205的数据,⽽显⽰不出来郑州、新乡和安阳的标识。
为了实现这样的数据显⽰出来三个序列,分别为郑州、新乡、安阳的电量,就需要⾃⼰实现对这样数据的转换,转换成如下的形式:
⽉份                  郑州-电量        新乡-电量                安阳-电量
201201              33                      29                                23
201202              35                      26                                25
201203              34                      27                                24
201204              36                      28                                26
201205              34.3                    28.8                            24.3
这样,Ext的图表就能把它显⽰成三个序列了。
我写了如下的函数实现这个功能:
function CovertData(jsonData,idField, fromField, toField){
var result = [], curRecord =null, num;
var fromFields = fromField.split(',');
/
/ 循环整个数组:[{...},{...},{...},...]
for(var idx=0;idx<jsonData.length;idx++){
num = findIdx(result, idField, jsonData[idx][idField]);
if(num!=-1){
curRecord = result[num];
}
else{
curRecord = {};
};
// 循环每个json对象中的字段
for(var key in jsonData[idx]){
/
/ 处理转换的数据内容
for(var i=0;i<fromFields.length;i++){
if(key == fromFields[i]){
curRecord[jsonData[idx][toField]+'-' + fromFields[i]] = jsonData[idx][key];                    break;
}
}
// 除数据内容外,只处理标识字段数据
if(key == idField){
js获取json的key和valuecurRecord[key] = jsonData[idx][key];
}
}
if(num==-1){
result.push(curRecord);
}
}
return result;
}
function findIdx(jsonData, columnName, value){
for(var idx = 0;idx<jsonData.length;idx++){
if(jsonData[idx][columnName]==value)
return idx;
}
return -1;
}
JsTestDriver的测试代码如下:
TestCase("Test json data row to column",{
setUp:function(){
this.jsonData = [{yearmonth:201201,ppq:23,spq:27,company:'dfsoft'},
{yearmonth:201202,ppq:33,spq:38,company:'dfsoft'},
{yearmonth:201203,ppq:43,spq:49,company:'dfsoft'},
{yearmonth:201204,ppq:53,spq:51,company:'dfsoft'},
{yearmonth:201201,ppq:29,spq:26,company:'vcom'},
{yearmonth:201202,ppq:34,spq:38,company:'vcom'},
{yearmonth:201203,ppq:48,spq:43,company:'vcom'},
{yearmonth:201204,ppq:52,spq:59,company:'vcom'}];
var fromField = 'ppq,spq', toField = 'company', idField = 'yearmonth';
},
"test store has columns":function(){
var month1 = sultData[sultData,'yearmonth',201201)];        var month2 = sultData[sultData,'yearmonth',201202)];        var month3 = sultData[sultData,'yearmonth',201203)];        var month4 = sultData[sultData,'yearmonth',201204)];
assertEquals(sultData.length);
assertEquals('23',month1['dfsoft-ppq']);
assertEquals('29',month1['vcom-ppq']);
assertEquals('33',month2['dfsoft-ppq']);
assertEquals('34',month2['vcom-ppq']);
assertEquals('43',month3['dfsoft-ppq']);
assertEquals('48',month3['vcom-ppq']);
assertEquals('53',month4['dfsoft-ppq']);
assertEquals('52',month4['vcom-ppq']);
assertEquals('27',month1['dfsoft-spq']);
assertEquals('26',month1['vcom-spq']);
assertEquals('38',month2['dfsoft-spq']);
assertEquals('38',month2['vcom-spq']);
assertEquals('49',month3['dfsoft-spq']);
assertEquals('43',month3['vcom-spq']);
assertEquals('51',month4['dfsoft-spq']);
assertEquals('59',month4['vcom-spq']);
}
})
测试通过,表⽰转换成功。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。