Welcome 微信登录

首页 / 脚本样式 / JavaScript / js实现json数据行到列的转换的实例代码

月份 郑州-电量 新乡-电量 安阳-电量
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){
curRecord[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";
this.resultData = CovertData(this.jsonData,idField,fromField, toField);
},
"test store has columns":function(){
var month1 = this.resultData[findIdx(this.resultData,"yearmonth",201201)];
var month2 = this.resultData[findIdx(this.resultData,"yearmonth",201202)];
var month3 = this.resultData[findIdx(this.resultData,"yearmonth",201203)];
var month4 = this.resultData[findIdx(this.resultData,"yearmonth",201204)];

assertEquals(4,this.resultData.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"]);
}
})

测试通过,表示转换成功。