欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue如何使用笛卡爾積算法構(gòu)建sku表格

 更新時間:2023年04月19日 11:01:17   作者:~檸涼id  
這篇文章主要介紹了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)文章

  • VUE項目axios請求頭更改Content-Type操作

    VUE項目axios請求頭更改Content-Type操作

    這篇文章主要介紹了VUE項目axios請求頭更改Content-Type操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue3中引入Pinia存儲庫使用示例詳解

    Vue3中引入Pinia存儲庫使用示例詳解

    這篇文章主要介紹了Vue3中引入Pinia存儲庫使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Vue替代vuex的存儲庫Pinia詳細(xì)介紹

    Vue替代vuex的存儲庫Pinia詳細(xì)介紹

    這篇文章主要介紹了Vue替代vuex的存儲庫Pinia,聽說pinia與vue3更配,便開啟了vue3的學(xué)習(xí)之路,pinia 和 vuex 具有相同的功效, 是 Vue 的存儲庫,它允許您跨組件/頁面共享狀態(tài)
    2022-09-09
  • electron-vite新一代electron開發(fā)構(gòu)建工具

    electron-vite新一代electron開發(fā)構(gòu)建工具

    這篇文章主要介紹了electron-vite新一代electron開發(fā)構(gòu)建工具,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • elementui?el-select?change事件傳參問題

    elementui?el-select?change事件傳參問題

    這篇文章主要介紹了elementui?el-select?change事件傳參問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • vue實現(xiàn)的上拉加載更多數(shù)據(jù)/分頁功能示例

    vue實現(xiàn)的上拉加載更多數(shù)據(jù)/分頁功能示例

    這篇文章主要介紹了vue實現(xiàn)的上拉加載更多數(shù)據(jù)/分頁功能,涉及基于vue的事件響應(yīng)、數(shù)據(jù)交互等相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • Vue3.0 自己實現(xiàn)放大鏡效果案例講解

    Vue3.0 自己實現(xiàn)放大鏡效果案例講解

    這篇文章主要介紹了Vue3.0 自己實現(xiàn)放大鏡效果案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 編寫v-for循環(huán)的技巧匯總

    編寫v-for循環(huán)的技巧匯總

    這篇文章主要介紹了編寫更好的v-for循環(huán)的6種技巧,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • vscode中Vue別名路徑提示的實現(xiàn)

    vscode中Vue別名路徑提示的實現(xiàn)

    這篇文章主要介紹了vscode中Vue別名路徑提示的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Vue彈窗組件的實現(xiàn)方法

    Vue彈窗組件的實現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了Vue彈窗組件的實現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09

最新評論