vue如何使用笛卡爾積算法構(gòu)建sku表格
1.根據(jù)笛卡爾積算法來構(gòu)建二維數(shù)組
- 變量1接收過濾的tag標(biāo)簽,生成二維數(shù)組組
- 變量2獲取維度名稱
判斷如果規(guī)格長度等于0,直接把規(guī)格屬性賦空,然后使用笛卡爾積算法將數(shù)據(jù)進行交叉處理(使用reduce方法,參數(shù)1:空的二維數(shù)組,參數(shù)2:變量2的數(shù)據(jù)(維度名稱標(biāo)簽),在聲明一個空的數(shù)組array(用這個空數(shù)組去匹配交叉數(shù)組),再拿出reduce參數(shù)1空的二維數(shù)組,forEach循環(huán)遍歷,在使用forEach遍歷變量2數(shù)據(jù)(維度名稱標(biāo)簽),進行交叉匹配,連接起來添加進array空數(shù)組,然后在這個二維數(shù)組中重新映射為對象數(shù)組,進行拼接數(shù)據(jù)構(gòu)建sku表格
// 根據(jù)笛卡爾積來構(gòu)建二維數(shù)組,在這個二維數(shù)組中重新映射為對象數(shù)組,首先過濾 function addTag() { ? ? // 根據(jù)笛卡爾積來構(gòu)建二維數(shù)組,在這個二維數(shù)組中重新映射為對象數(shù)組 ? ? const specList = formListAdd.value.specificationList//過濾tag標(biāo)簽,生成2維數(shù)組:? ? ? //數(shù)組對象中的數(shù)組取出,得到一個二維數(shù)組(藍色tag標(biāo)簽) ? ? const valueList = specList.filter((item: any) => item.values.length).map((item: any) => item.values) ? ? // 添加name值(黃色tag標(biāo)簽)//獲取維度名稱,放到數(shù)組中 右邊 ? ? const titlesList = specList.filter((item: any) => item.title.length).map((item: any) => item.title) ? ? if (valueList.length == 0) {//如果規(guī)格沒有這種屬性,直接把規(guī)格屬性賦空 ? ? ? ? formListAdd.value.skuList = [] ? ? ? ? return ? ? } ? ? // 使用笛卡爾積算法將數(shù)據(jù)進行交叉處理 ? ? var skuArr = valueList.reduce((pre: string[][], next: any[]) => {//pre是一個空的二維數(shù)組 next(黃色tag標(biāo)簽)的內(nèi)容也就是類型 ? ? ? ? var array: string[][] = []//用這個空數(shù)組去匹配交叉數(shù)組 ? ? ? ? pre.forEach(item1 => {//拿出空的一維數(shù)組 ? ? ? ? ? ? next.forEach(item2 => {//遍歷黃色tag標(biāo)簽內(nèi)容,也就是交叉匹配 ? ? ? ? ? ? ? ? array.push(item1.concat([item2]))//連接起來添加進array空數(shù)組 ? ? ? ? ? ? ? ? return array ? ? ? ? ? ? }) ? ? ? ? }) ? ? ? ? return array ? ? }, [[]]) ? ? // 進行拼接數(shù)據(jù) ? ? //構(gòu)建sku表格--最終渲染出表格 ? ? let list = skuArr.map((item: any, index: number) => {//根據(jù)skuArr來構(gòu)建對象數(shù)組? ? ? ? ? let obj = { //對象將屬性值并渲染到sku表格中 ? ? ? ? ? ? price: formListAdd.value.skuList[index] ? formListAdd.value.skuList[index].price : 1,//現(xiàn)價 ? ? ? ? ? ? originalPrice: formListAdd.value.skuList[index] ? formListAdd.value.skuList[index].originalPrice : 1,//原價 ? ? ? ? ? ? vipPrice: formListAdd.value.skuList[index] ? formListAdd.value.skuList[index].vipPrice : 1,//vip價格 ? ? ? ? ? ? stock: 0,//庫存 ? ? ? ? ? ? weight: 0,//重量 ? ? ? ? ? ? img: "",//圖片 ? ? ? ? ? ? barCode: 0,//隨機碼 ? ? ? ? ? ? title: '',//維度名稱 ? ? ? ? ? ? specification: '' ? ? ? ? } as any ? ? ? ? // 遍歷循環(huán)添加到sku數(shù)組中 ? ? ? ? item.forEach((val: number, index: number) => { ? ? ? ? ? ? // 相當(dāng)于是添加一個對象 ? ? ? ? ? ? obj['sku_' + titlesList[index]] = val; ? ? ? ? ? ? obj['title'] = item.join(',') ? ? ? ? ? ? obj['specification'] += formListAdd.value.specificationList[index].title + '_' + val + ',' ? ? ? ? }); ? ? ? ? return obj; ? ? }) ? ? formListAdd.value.skuList.length = 0;//每次刪除tag標(biāo)簽調(diào)用笛卡爾算法 ? ? Object.assign(formListAdd.value.skuList, list)//最終合并渲染數(shù)據(jù)到sku表 }
2.合并表格
首先獲取規(guī)格列表,判斷然后對要跨行的列進行計算排除最后一個樹形列,定義跨行的數(shù)量為1,循環(huán)遍歷獲取每一列要合并的
行數(shù),將跨行的數(shù)量=后面數(shù)組長度的乘積,每次跨行的數(shù)量相同,所以當(dāng)前行索引取余數(shù)%跨行數(shù)量==0就是要跨行的開始
? <!-- 商品詳情表格渲染 ?span-method合并行或列的計算方法 --> ? ? ? ? ? ? ? ? <el-table :data="formListAdd.skuList" style="width: 100%" border :span-method="objectSpanMethod"> ? ? ? ? ? ? ? ? ? ? <el-table-column width="100" align="center" ? ? ? ? ? ? ? ? ? ? ? ? v-for="item in (<any>formListAdd.specificationList).filter((item: any) => item.values.length > 0)" ? ? ? ? ? ? ? ? ? ? ? ? :prop="'sku_' + item.title" :label="item.title" /> ? ? ? ? ? ? ? ? ? ? <!-- 循環(huán)數(shù)組,過濾數(shù)組的長度 --> ? ? ? ? ? ? ? ? ? ? <el-table-column prop="SkuIds" label="SkuId" align="center" /> ? ? ? ? ? ? ? ? ? ? <el-table-column prop="vipPrice" label="¥VIP價(元)" width="150" align="center"> ? ? ? ? ? ? ? ? ? ? ? ? <template #default="scope"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-input-number v-model="scope.row.vipPrice" size="small" :min="1" /> ? ? ? ? ? ? ? ? ? ? ? ? </template> ? ? ? ? ? ? ? ? ? ? </el-table-column> ? ? ? ? ? ? ? ? ? ? <el-table-column prop="originalPrice" label="吊牌價" width="150" align="center"> ? ? ? ? ? ? ? ? ? ? ? ? <template #default="scope"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-input-number v-model="scope.row.originalPrice" size="small" :min="1" /> ? ? ? ? ? ? ? ? ? ? ? ? </template> ? ? ? ? ? ? ? ? ? ? </el-table-column> ? ? ? ? ? ? ? ? ? ? <el-table-column prop="price" label="價格" width="150" align="center"> ? ? ? ? ? ? ? ? ? ? ? ? <template #default="scope"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-input-number v-model="scope.row.price" size="small" :min="1" /> ? ? ? ? ? ? ? ? ? ? ? ? </template> ? ? ? ? ? ? ? ? ? ? </el-table-column> ? ? ? ? ? ? ? ? ? ? <el-table-column prop="stock" label="庫存" width="150" align="center"> ? ? ? ? ? ? ? ? ? ? ? ? <template #default="scope"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-input-number v-model="scope.row.stock" size="small" :min="1" /> ? ? ? ? ? ? ? ? ? ? ? ? </template> ? ? ? ? ? ? ? ? ? ? </el-table-column> ? ? ? ? ? ? ? ? ? ? <el-table-column prop="weight" label="重量" width="150" align="center"> ? ? ? ? ? ? ? ? ? ? ? ? <template #default="scope"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-input-number v-model="scope.row.weight" size="small" :min="1" /> ? ? ? ? ? ? ? ? ? ? ? ? </template> ? ? ? ? ? ? ? ? ? ? </el-table-column> ? ? ? ? ? ? ? ? ? ? <el-table-column prop="img" label="SUK圖片" width="150" align="center"> ? ? ? ? ? ? ? ? ? ? ? ? <template #default="scope"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-upload action="http://192.168.1.188:8080/upload/admin" :show-file-list="false" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :headers="headers" :on-success="handlePicSuccess" :before-upload="beforeAvatarUpload"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <img v-if="scope.row.img" :src="scope.row.img" class="avatars" /> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-icon v-else @click="imgIndex = scope.$index"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <Upload /> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </el-icon> ? ? ? ? ? ? ? ? ? ? ? ? ? ? </el-upload> ? ? ? ? ? ? ? ? ? ? ? ? </template> ? ? ? ? ? ? ? ? ? ? </el-table-column> ? ? ? ? ? ? ? ? ? ? <el-table-column prop="barCode" label="條形碼" width="250" align="center"> ? ? ? ? ? ? ? ? ? ? ? ? <template #default="scope"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-input v-model="scope.row.barCode" size="small" style="width:200px;"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <template #append> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-button @click="scope.row.barCode = new Date().getTime()" size="small">隨機</el-button> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </template> ? ? ? ? ? ? ? ? ? ? ? ? ? ? </el-input> ? ? ? ? ? ? ? ? ? ? ? ? </template> ? ? ? ? ? ? ? ? ? ? </el-table-column> ? ? ? ? ? ? ? ? </el-table>
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: any) => {//行 列 行的下標(biāo) 列的下標(biāo) ? ? //拿到第一列要合并的行數(shù)(獲取列表) 第一次渲染頁面時彈框數(shù)組為空,會報空指針錯誤,需要使用?.運算符解決 ? ? let specList = formListAdd.value.specificationList.filter((e: any) => e.values?.length > 0); ? ? if (columnIndex < specList.length - 1) {//對要跨行的列進行計算,排除最后一個屬性列(最后一個屬性列不存在跨行中) ? ? ? ? let rowSpanNum = 1;//跨行的數(shù)量 ? ? ? ? for (let i = columnIndex + 1; i < specList.length; i++) { ? ? ? ? ? ? //依次拿到每一列要合并的行數(shù) ? ? ? ? ? ? rowSpanNum *= specList[i].values.length;//跨行的數(shù)量=后面數(shù)組長度的乘積 ? ? ? ? } ? ? ? ? if (rowIndex % rowSpanNum === 0) {//每次跨行的數(shù)量相同,所以當(dāng)前行索引取余數(shù)%跨行數(shù)量==0就是要跨行的開始 ? ? ? ? ? ? return { rowspan: rowSpanNum, colspan: 1 } //當(dāng)條件成立時,即合并行數(shù) ? ? ? ? } else { ? ? ? ? ? ? return { rowspan: 0, colspan: 0 } ? ? ? ? } ? ? }
注意(實現(xiàn)具體思路)
a.首先我們添加規(guī)格時會生成一個規(guī)格的表格,然后也會生成一個由tag標(biāo)簽形成的標(biāo)簽項,此項就是添加的規(guī)格
b.例如我添加兩個規(guī)格,一個是尺寸,一個是顏色,那么就會生成兩個tag標(biāo)簽項,當(dāng)然tag標(biāo)簽項除了有規(guī)格之外還有一個動態(tài)編輯標(biāo)簽,意思就是跨域往規(guī)格里面添加不同的規(guī)格,如顏色可以添加紅色,藍色,尺寸可以添加XL,M等維度,那么在表格中怎么去生成尺寸和顏色這兩個規(guī)格的數(shù)據(jù)呢?
c.首先我是定義一個數(shù)組,然后我們添加規(guī)格的時候把規(guī)格以對象的形式push進去數(shù)組中,當(dāng)我們?nèi)ゾ庉媡ag標(biāo)簽的時候,把tab的內(nèi)容以數(shù)組的方式添加進去規(guī)格的對象中,做完這些操作之后就是生成SKU表格了
d.這里是采用計算屬性的方式來實現(xiàn)的,首先使用map映射的方式獲取到所有的規(guī)格組成一個二維數(shù)組例如上面添加的尺寸和顏色,那么就會獲取到一個二維數(shù)組,二維數(shù)組中XL,M組成一個數(shù)組,藍色,紅色也組成一個數(shù)組,然后使用map獲取到尺寸和顏色組成的數(shù)組
e.接下來是針對于二維數(shù)組使用笛卡爾積算法獲得所有規(guī)格交叉之后組成的二維數(shù)組,意思就是獲取一個二維數(shù)組,二維數(shù)組中尺寸和顏色全部交叉組成,組成新的一個二維數(shù)組,即生成XL和紅色,XL和藍色,M和紅色,M和藍色的數(shù)組,得到新的二維數(shù)組之后
f.我們還需要把這個二維數(shù)組使用雙重循環(huán)的方式拿到每個數(shù)組的元素,然后以規(guī)格當(dāng)做key,具體的規(guī)格值當(dāng)做value的方式添加進去對象中
g.然后定義一個數(shù)組,把對象push進去數(shù)組中,最后把這個數(shù)組渲染到表格上就可以了,表格中的的prop屬性是定義對象時的規(guī)格key值
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
electron-vite新一代electron開發(fā)構(gòu)建工具
這篇文章主要介紹了electron-vite新一代electron開發(fā)構(gòu)建工具,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04elementui?el-select?change事件傳參問題
這篇文章主要介紹了elementui?el-select?change事件傳參問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01vue實現(xiàn)的上拉加載更多數(shù)據(jù)/分頁功能示例
這篇文章主要介紹了vue實現(xiàn)的上拉加載更多數(shù)據(jù)/分頁功能,涉及基于vue的事件響應(yīng)、數(shù)據(jù)交互等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05