一、使用笛卡尔积算法将数据进行交叉处理
// 使用笛卡尔积算法将数据进行交叉处理
var valueList = [["湖南","湖北"],["河南","河北"]]
var skuArr = valueList.reduce((pre: string[][], next: any[]) => {
var array: string[][] = []
pre.forEach(item1 => {
next.forEach(item2 => {
array.push(item1.concat([item2]))
return array
})
})
return array
}, [[]])
console.log(skuArr, "skuArr");
说明:变的是valueList这个需要处理的二维数组,不变的是算法
二、表格合并处理
在html中
<el-table :data="form.skuList" :span-method="objectSpanMethod" style="width: 100%" border>
<el-table-column v-for="item in form.specificationList.filter((item: any) => item.values.length > 0)" width="100"
align="center" :prop="'sku_' + item.title" :label="item.title" />
<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" @change="handleChange" />
</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" @change="handleChange" />
</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"
@change="handleChange" />
</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>
说明:主要是在table标签上添加 :span-method="objectSpanMethod"属性,后面的内容不重要
在js中
//合并表格
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: any) => {
//拿到第一列要合并的行数
let specList = form.value.specificationList.filter((e: any) => e.values?.length > 0);
if (columnIndex < specList.length - 1) {
let rowSpanNum = 1;
for (let i = columnIndex + 1; i < specList.length; i++) {
//依次拿到每一列要合并的行数
rowSpanNum *= specList[i].values.length;
}
if (rowIndex % rowSpanNum === 0) {
//当条件成立时,即合并行数
return { rowspan: rowSpanNum, colspan: 1 }
} else {
return { rowspan: 0, colspan: 0 }
}
}
}
说明:具体看graduation项目中的goodsmanage/ProductCreate.vue文件