js数组行转列

本文介绍了一种将JSON数据中X与Y轴数据进行转换的方法,通过自定义函数实现行列互换,适用于图表展示前的数据预处理。示例代码展示了如何将时间序列数据从行转为列,便于进一步分析和可视化。

最近研究一个问题,数据表取出的数据需要通过图表的形式展示,但图标X与y轴的数据相反,需要进行行列转换,查了很多资料,通过修改,最后得出自己需要的结果,直接上代码


        /* json数据行列转换
     * @jsonData json数据源
     * @colField 生成列名的字段
     * @colName 生成列名的名称
     * @valueField 生成值的字段
    */
        function row2col(jsonData, colField, colName,valueField) {
            var result = []; //存储返回的数据
            var colFields = colField.split(',');
            var colNames = colName.split(',');
            // 指定的colFields列下的数据作为y轴,则取出该列的数据作为y轴即可
            for (var i = 0; i < colFields.length; i++) {
                var curRecord = {};
                curRecord["mc"] = colNames[i];
            // 循环整个JSON数组:
            for (var idx = 0; idx < jsonData.length; idx++) {

                //当前json数据对象
                var cdata = jsonData[idx];
                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) - 1;
                // }

                result[i] = curRecord;
            }
            
            return result;
        }
//测试代码:
 var jsonData = [
                { rq: 201201, rs: 500, je: 4500, pjje: 24 },
                { rq: 201202, rs: 700, je: 6500, pjje: 54 },
                { rq: 201203, rs: 800, je: 7500, pjje: 64},
                { rq: 201204, rs: 900, je: 8500, pjje: 74}];

            
            var colField = 'rs,je,pjje', colName = "人数,金额,平均金额", valueField = 'rq'; 
            var resultData = row2col(jsonData, colField, colName, valueField);

输出结果:
resultData=[
{ mc:‘人数’, 201201:500, 201202:700, 201203:800, 201204:900 },
{ mc:‘金额’, 201201:45500, 201202:6500, 201203:7500, 201204:8500 },
{ mc:‘平均金额’, 201201:24, 201202:54, 201203:64, 201204:74 },
]

JavaScript 中,将横向数组(一维数组)转换为纵向数组(二维数组)的过程通常涉及将数组的元素按特定行数或列数重新组织。以下是一些常见的实现方法。 ### 方法一:使用循环和 `push` 方法 此方法通过遍历原始数组,并将每个元素按列数依次放入新的二维数组中。 ```javascript function transposeArray(arr, cols) { var result = []; for (var i = 0; i < arr.length; i++) { var row = Math.floor(i / cols); var col = i % cols; if (!result[row]) { result[row] = []; } result[row][col] = arr[i]; } return result; } var oldarr = [2004, 2005, 2006, 2007, 2008, 46890000, 55900500, 33786400, 57054400, 61834100, 28440000, 29340700, 15127600, 16771500, 36568800]; var newarr = transposeArray(oldarr, 5); console.log(newarr); ``` ### 方法二:利用 `reduce` 方法 此方法通过 `reduce` 函数将一维数组转换为二维数组,逻辑清晰且代码简洁。 ```javascript function transposeArrayWithReduce(arr, cols) { return arr.reduce((acc, val, idx) => { const row = Math.floor(idx / cols); if (!acc[row]) { acc[row] = []; } acc[row].push(val); return acc; }, []); } var oldarr = [2004, 2005, 2006, 2007, 2008, 46890000, 55900500, 33786400, 57054400, 61834100, 28440000, 29340700, 15127600, 16771500, 36568800]; var newarr = transposeArrayWithReduce(oldarr, 5); console.log(newarr); ``` ### 方法三:使用 `map` 和 `filter` 方法 此方法结合 `map` 和 `filter` 实现数组的转置,适用于特定场景。 ```javascript function transposeWithMap(arr, cols) { return arr.map((_, i) => arr.filter((__, j) => j % cols === i) ); } var oldarr = [2004, 2005, 2006, 2007, 2008, 46890000, 55900500, 33786400, 57054400, 61834100, 28440000, 29340700, 15127600, 16771500, 36568800]; var newarr = transposeWithMap(oldarr, 5); console.log(newarr); ``` ### 方法四:利用 `slice` 方法 此方法通过 `slice` 方法将一维数组切分为多个子数组,从而形成二维数组。 ```javascript function transposeWithSlice(arr, cols) { var result = []; for (var i = 0; i < arr.length; i += cols) { result.push(arr.slice(i, i + cols)); } return result; } var oldarr = [2004, 2005, 2006, 2007, 2008, 46890000, 55900500, 33786400, 57054400, 61834100, 28440000, 29340700, 15127600, 16771500, 36568800]; var newarr = transposeWithSlice(oldarr, 5); console.log(newarr); ``` ### 总结 以上方法均能实现将一维数组转换为二维数组的需求,具体选择哪种方法取决于实际应用场景和个人偏好。每种方法都有其独特的实现逻辑和适用场景。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值