vue实现行列转换的一种方法


Posted in Javascript onAugust 06, 2019

行列转换是一个老生常谈的问题,这几天逛知乎有遇到了这个问题。一个前端说,拿到的数据是单列的需要做转换才能够绑定,折腾了好久才搞定,还说这个应该后端直接出数据,不应该让前端折腾。

这个嘛,行列转换在后端也不是很好解决的问题,而且还有一个性能的问题,综合考虑,我还是觉得应该由前端进行行列转换。光说不练假把式,所以拿出来代码仅作为抛砖引玉,供大家参考一下,如果有更好的方法,欢迎一起来探讨。

1、模板设计。

<div id="app">
   <table class="table_default1" style="width: 400px;">
     <tr>
       <th v-for="item in tableHeader">
         {{item}} 
       </th>
     </tr>
     <tr v-for="tr in tableBody">
       <td v-for="td in tr">
         {{td}}
       </td>
     </tr>
   </table>
 </div>

这个比较简单,先遍历 tableHeader    把表头循环出来。

然后在双重遍历,tableBody 提供行数据,然后在遍历出来td。

这里没有任何与业务逻辑相关的代码,也就是说这个模板可以适合任何行列转换的需求。可以绑定出来 m行n列  的表格。

2、然后是vue实例部分 

var form = new Vue({
     el: "#app",
     data: {
       tableHeader: { }, //绑定表头
       tableBody: { } //绑定数据
     },
     created: function () {
       //代码在下面
     }
   });

这里data的两个成员都是空的,因为其结构要根据后台传递过来的数据决定,所以这里就不写了,当然 tableHeader 和 tableBody 还是要先写一下占个位置,否则模板的地方就没法写了。

不过还是先写一个结构参考一下,否则下面的代码估计看着会比较晕

2.1  tableHeader  的结构。这个很简单了。

{
   name: "姓名",
   studentID: "学号",
   "数学": "数学",
   "物理": "物理",
   "英语": "英语",
   "语文": "语文",
 }

2.2  tableBody  的结构。这里并没有使用数组,因为数组不好定位,用key的方式可以很方便的定位,key值的规律就是 标识 + 学号,比如s1。纯数字作为key,可能会有点问题,所以就加了个标识。

对了,可以多一个科目的,比如“物理”,只要tableHeader里面有就可以。

{
  s1: {
    studentID: 1,
    name: "小红", 
    数学: 200,
    语文: 190,
    英语: 191
  }
  s2: {
    studentID: 2, 
    name: "小明", 
    数学: 193, 
    语文: 187,
    英语: 188,
    物理: 99
  }
  s3: {
    studentID: 3, 
    name: "韩梅梅", 
    数学: 194, 
    语文: 199, 
    英语: 198
  }
}

3、最后是转换函数

//得到测试数据
       var testdata = [
         {
           studentID: 0001,
           name: '小红',
           subject: '数学',
           mark: 100
         }, {
           studentID: 0001,
           name: '小红',
           subject: '语文',
           mark: 90
         }, {
           studentID: 0001,
           name: '小红',
           subject: '英语',
           mark: 91
         }, {
           studentID: 0002,
           name: '小明',
           subject: '数学',
           mark: 93
         }, {
           studentID: 0002,
           name: '小明',
           subject: '语文',
           mark: 87
         }, {
           studentID: 0002,
           name: '小明',
           subject: '英语',
           mark: 88
         }, {
           studentID: 0002,
           name: '小明',
           subject: '物理',
           mark: 88
         }, {
           studentID: 0003,
           name: '韩梅梅',
           subject: '数学',
           mark: 94
         }, {
           studentID: 0003,
           name: '韩梅梅',
           subject: '语文',
           mark: 99
         }, {
           studentID: 0003,
           name: '韩梅梅',
           subject: '英语',
           mark: 98
         }
       ];
       //第一次遍历,制作 tableHeader
       var th = {}
       th["studentID"] = '学号'; //固定列
       th["name"] = '姓名';
       //筛选科目
       var thKey = {}
       for (var i = 0; i < testdata.length; i++) {
         thKey[testdata[i].subject] = 1; //动态列
       }
       //把科目加到th里面 ,动态增加列
       for (var key in thKey) {
         th[key] = key;
       }
       this.tableHeader = th;
       //第二次遍历,制作tr的行
       var tr = {};
       for (var i = 0; i < testdata.length; i++) {
         var d = testdata[i];
         tr['s' + d.studentID] = {
           studentID: d.studentID, //固定列
           name: d.name
         }
       }
       //第三次遍历,添加科目的成绩
       for (var i = 0; i < testdata.length; i++) {
         var d = testdata[i];
         tr['s' + d.studentID][d.subject] = d.mark + 100; //动态列
       }
       this.tableBody = tr;

这个可以写在 created 里面,当然写在其他地方也可以,只要把数据给过去就行。

前面是给了一个测试数据,数据结构并不仅限于这样,改成其他的业务也是可以的,只需要知道 studentID 是一个标识列,确定有多少行。 name 是附带的,有没有都行,因为有可能重名,所以不能用name做标识,要用学号。

subject 是负责确定要增加多少列的,值相同的放到一列,不同的另起一列。

mark 是每一行的分数,和 subject 是key value的关系,subject 是key, Mark是value,只不过这个变成了上下关系。subject在表头,Mark在body里面。

自我感觉注释写的还算可以的。如果有看不明白的,欢迎讨论。

最后效果图一张

vue实现行列转换的一种方法

总结

以上所述是小编给大家介绍的vue实现行列转换的一种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
Jul 19 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
Apr 15 Javascript
jquery DOM操作 基于命令改变页面
May 06 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
Aug 01 Javascript
用JS判断IE版本的代码 超管用!
Aug 09 Javascript
JS动态添加与删除select中的Option对象(示例代码)
Dec 20 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
Jun 23 Javascript
jquery html5 视频播放控制代码
Nov 06 Javascript
Reactjs实现通用分页组件的实例代码
Jan 19 Javascript
JavaScript设计模式之代理模式简单实例教程
Jul 03 Javascript
vue.js实现的幻灯片功能示例
Jan 18 Javascript
js实现简易计算器小功能
Nov 18 Javascript
微信小程序点餐系统开发常见问题汇总
Aug 06 #Javascript
详解使用WebPack搭建React开发环境
Aug 06 #Javascript
vue-cli3+typescript新建一个项目的思路分析
Aug 06 #Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 #Javascript
angularjs请求数据的方法示例
Aug 06 #Javascript
通过js示例讲解时间复杂度与空间复杂度
Aug 06 #Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
Aug 06 #Javascript
You might like
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
深入分析php之面向对象
2013/05/15 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
PHP自定义多进制的方法
2016/11/03 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
深入理解python函数递归和生成器
2016/06/06 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
Python面向对象封装操作案例详解 II
2020/01/02 Python
python 实现汉诺塔游戏
2020/11/28 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
UNIX文件系统分类
2014/11/11 面试题
应届生求职信写作技巧
2013/10/24 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python