詳解js如何優(yōu)雅處理后端返回的單元格數(shù)據(jù)
我們需要渲染一個4行3列的表格,我們只需要配置好columns:[{},{},{}],數(shù)據(jù)dataSource:[{},{},{},{}],當(dāng)我們columns中對象的屬性與dataSource中對象的屬性對應(yīng)時,就可以正常渲染數(shù)據(jù)啦。但是當(dāng)我們的后端不是以每行數(shù)據(jù)進行返回,而是將每個單元格的數(shù)據(jù)作為一個對象返回時,我們就要自己按行處理數(shù)據(jù)了。接下來分享一下我的思路。
解題思路: 1、不管后端返回給我們多少條數(shù)據(jù),我們只需要明確我們需要的是幾行數(shù)據(jù),也就是需要定義包含幾個對象的數(shù)組。 2、根據(jù)后端返回每個單元格中的兩個字段唯一確定行和列。再根據(jù)行列取出對應(yīng)單元格數(shù)據(jù)添加到剛才創(chuàng)建的數(shù)組中,就可以成功渲染數(shù)據(jù)了。
具體實現(xiàn):
1.定義tableColumns:我這里的列和行相等,是動態(tài)的數(shù)據(jù)根據(jù)num進行遍歷渲染得到
computed: {
tableColumns() {
this.list = []
let columnsTemp = public_deepCopy(this.columns);
for (let i = 0; i < this.num; i++) {
this.list.push({
title: i + 1,
dataIndex: i + 1,
key: i + 1,
align: 'center',
scopedSlots: {customRender: i + 1}
});
}
columnsTemp.push(...this.list)
return columnsTemp
}
}
2.定義一個函數(shù),用來初始化行,方便處理后端返回的數(shù)據(jù)
先來看一下后端返回數(shù)據(jù)格式

我這里的num和sort就可以唯一確定是哪個單元格,num代表行號,sort代表列號
接下來我們開始定義函數(shù)初始化行數(shù)據(jù)
getArray(arr) {
// 初始化行,這里根據(jù)num的值確定需要幾行,創(chuàng)建包含幾個對象的空數(shù)據(jù)
const rows = Array.from({length: this.num}, () => ({}));
// 根據(jù)num也就是行數(shù)-1,確定索引,我們可以知道像一行添加數(shù)據(jù),在將sort作為對象的屬性名,item作為屬性值將數(shù)據(jù)存儲到對應(yīng)的位置
arr.forEach(item => {
rows[item.num - 1][item.sort] = {
...item,
score: item.numerator && item.denominator ? item.numerator + '/' + item.denominator : ''
};
});
// 因為有的單元格沒有數(shù)據(jù),所以進行判斷將空位置填充為null
rows.forEach(row => {
for (let i = 1; i <= this.num; i++) {
if (!row.hasOwnProperty(i)) {
row[i] = null;
}
}
});
//最后將處理好的數(shù)據(jù)返回
return rows;
},
調(diào)接口處理數(shù)據(jù)
async queryTemplate() {
this.loading = true
const res = await queryWorkAllocationModule({
moduleId: this.moduleId
});
this.loading = false;
if (res.state === 200) {
this.dataSource = this.getArray(res.data);
} else {
this.$message.error(res.message)
}
},
處理好的數(shù)據(jù)結(jié)構(gòu)就是這樣啦,這樣就可以跟我們上面定義的tableColumns數(shù)組包含的對象屬性進行一一對應(yīng)了


渲染數(shù)據(jù)
<a-table
:columns="tableColumns"
:data-source="dataSource"
:loading="loading"
:pagination="false"
:rowKey="record => record.id"
bordered
>
<template slot="headerName">
<div style="position:relative;width:100px;">
<div style="text-align: right;">排名</div>
<div style="text-align: left;">人數(shù)</div>
</div>
</template>
<template slot="header" slot-scope="text, record, index">
{{ index + 1 }}
</template>
<template v-for="item in num" :slot="item" slot-scope="text, record, index">
<a-input v-if="record[item] && commenttype" :key="index"
v-model="text.score" placeholder="請輸入" style="text-align: center;border: none"></a-input>
<span v-if="record[item] && !commenttype">{{ text.score }}</span>
</template>
</a-table>
最后放上最終效果圖展示

數(shù)據(jù)處理完成,表格可以正確的被渲染出來了。
到此這篇關(guān)于詳解js如何優(yōu)雅處理后端返回的單元格數(shù)據(jù)的文章就介紹到這了,更多相關(guān)js處理后端返回數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于aotu.js實現(xiàn)微信自動添加通訊錄中的聯(lián)系人功能
這篇文章主要介紹了利用aotu.js實現(xiàn)微信自動添加通訊錄中的聯(lián)系人,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
jquery結(jié)合CSS使用validate實現(xiàn)漂亮的驗證
這篇文章主要介紹了jquery結(jié)合CSS使用validate實現(xiàn)漂亮的驗證,需要的朋友可以參考下2015-01-01
javascript與jquery動態(tài)創(chuàng)建html元素示例
這篇文章主要介紹了javascript與jquery動態(tài)創(chuàng)建html元素的方法,結(jié)合實例形式分析了javascript與jQuery動態(tài)創(chuàng)建頁面元素的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07
徹底搞懂JavaScript中的apply和call方法(必看)
下面小編就為大家?guī)硪黄獜氐赘愣甁avaScript中的apply和call方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
使用JS-SDK開發(fā)公眾號微信網(wǎng)頁的完整步驟
微信JS-SDK是微信公眾平臺 面向網(wǎng)頁開發(fā)者提供的基于微信內(nèi)的網(wǎng)頁開發(fā)工具包,下面這篇文章主要介紹了使用JS-SDK開發(fā)公眾號微信網(wǎng)頁的完整步驟,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-04-04
微信小程序全局變量改變監(jiān)聽的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于微信小程序全局變量改變監(jiān)聽的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用微信小程序具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
JavaScript提升性能的常用技巧總結(jié)【經(jīng)典】
這篇文章主要介紹了JavaScript提升性能的常用技巧,結(jié)合實例形式總結(jié)分析了JavaScript編程中常見的性能提升優(yōu)化技巧,涉及作用域、循環(huán)、變量、DOM及函數(shù)節(jié)流等,非常具有實用價值,需要的朋友可以參考下2016-06-06

