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){
                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']);
    }
})

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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值