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

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

  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实现行列转换的一种方法。的更多相关文章

  1. SAP行列转换的一种方法

    一段经典的代码写在这里 TABLES spfli. DATA: lt_data TYPE STANDARD TABLE OF spfli, lwa_ref TYPE REF TO data, lt_f ...

  2. java字符串大小写转换的两种方法

    转载自:飞扬青春sina blogjava字符串大小写转换的两种方法 import java.io..* public class convertToPrintString {          pu ...

  3. vue中使用echarts的两种方法

    在vue中使用echarts有两种方法一.第一种方法1.通过npm获取echarts npm install echarts --save 2.在vue项目中引入echarts 在 main.js 中 ...

  4. Oracle学习之路-- 案例分析实现行列转换的几种方式

    注:本文使用的数据库表为oracle自带scott用户下的emp,dept等表结构. 通过一个例子来说明行列转换: 需求:查询每个部门中各个职位的总工资 按我们最原始的思路可能会这么写:       ...

  5. vue实现打印功能的两种方法

    第一种方法:通过npm 安装插件 1,安装  npm install vue-print-nb --save 2,引入  安装好以后在main.js文件中引入 import Print from 'v ...

  6. Vue中组件通信的几种方法(Vue3的7种和Vue2的12种组件通信)

    Vue3组件通信方式: props $emit expose / ref $attrs v-model provide / inject Vuex 使用方法: props 用 props 传数据给子组 ...

  7. vue中数据请求的三种方法

    注意请求可能存在跨域问题,需要去配置好 这三种建议使用axios 1.resource Vue 要实现异步加载需要使用到 vue-resource 库. Vue.js 2.0 版本推荐使用 axios ...

  8. js时间格式转换的几种方法

    公司项目需要获取时间并且转换格式,之前没有实现过但读过源码,新来的小哥给我讲了下细节.算是学到了..... function getLocalTime(){ var now=new Date(); v ...

  9. C#多显示器转换的两种方法——SetWindowPos,Screen

    原文 http://blog.csdn.net/hejialin666/article/details/6057551 实现多屏显示目的:一般情况下是一个电脑显示屏,外接一个电视显示屏.在电脑上显示的 ...

随机推荐

  1. Python开发【第五篇】: 内置模块

    内容概要 二分查找.冒泡 random time os sys pickle json shelve re 1.二分查找和冒泡排序 01. 二分查找 二分查找也称折半查找(Binary Search) ...

  2. .NET开发框架(四)-服务器IIS安装教程

    Windows Server 2012 R2 配置篇,包括服务器IIS安装.网络负载均衡器安装.ASP.NET Core 安装. 前三篇教程中,我们分享了框架的功能与视频演示介绍(文尾扫码 加入 框架 ...

  3. Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)

    简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或 ...

  4. 28nm工艺下,自动生成管脚排列文件,给设计加PAD,并在PAD上面打Label的流程(含Tcl脚本)

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众 ...

  5. 灵雀云CTO陈恺应邀出席国泰君安信息产业投资峰会,探讨全球科技产业新格局

    2019年7月9-10日,国泰君安信息产业投资峰会在上海陆家嘴举办.作为国内容器PaaS领域的龙头公司,灵雀云受邀出席本次大会,在“数字化转型从云做起”的论坛中,CTO陈恺发表了<云原生助力企业 ...

  6. .net core2学习笔记

    在Linux上安装完netcore的sdk后,发现每次重新登录dotnet命令都会失效,咨询完同事后才知道之前的设置只是临时变量,需要vim /etc/profile   编辑这个文件,把环境变量写入 ...

  7. ElementUI 源码简析——源码结构篇

    ElementUI 作为当前运用的最广的 Vue PC 端组件库,很多 Vue 组件库的架构都是参照 ElementUI 做的.作为一个有梦想的前端(咸鱼),当然需要好好学习一番这套比较成熟的架构. ...

  8. python 3.5学习笔记(第五章)

    本章内容 1.什么是模块 2.模块的导入方法 3.搜索路径 4.重要标准库 一.什么是模块 1.模块本质上是一个以.py 结尾的python文件,包含了python对象定义和python语句. 2.模 ...

  9. ctrl shift o失效

    是这样的.preference -> general -> keys ,找到Organize Imports ,然后 在 “WHEN”里面 要选择 Editing JAVA SOURCE. ...

  10. 个人永久性免费-Excel催化剂功能第82波-复制粘贴按源区域大小自动扩展收缩目标区域

    日常工作中,复制粘贴的操作,永远是最高频的操作,没有之一,在最高频的操作上,进行优化,让过程更智能,比一天到晚鼓吹人工智能替换人的骇人听闻的新闻来得更实际.此篇带来一点点的小小的改进,让日后无数的复制 ...