前言
最近接了私活,关于器械商城的项目,最后收尾阶段,发现发布商品还是存在着问题,对于多个相同/不同的商品规格输出成商品时,需要依据规格名对规格值进行排列组合,保证所有规格值都可以进行选择。
核心代码部分
数据结构
formState: {
goods: {
goodsSn: '', // 商品编号
...xxx
},
// 商品规格
specifications: [
{
specification: '规格',
value: '标准',
picUrl: '',
},
],
// 商品库存
products: [
{
// 商品规格列表
specifications: [],
price: 0,
number: 0,
url: '',
},
],
}
转换代码
// 规格 To 产品
const specToProduct = () => {
// 如果规格的数组长度为0,有可能此时为删除方法,则直接删除库存这一列
if (state.formState.specifications.length === 0) {
state.formState.products = [];
return;
}
// 根据specifications创建临时规格列表
var specValues = [];
// 数组的第一个规格值
var spec = state.formState.specifications[0].specification;
var values = [];
values.push(0);
for (var i = 1; i < state.formState.specifications.length; i++) {
// 每一项的规格值
const aspec = state.formState.specifications[i].specification;
// 去归总所有规格名相同的下标
// 如果当前项的规格值与遍历的规格值相同的话
if (aspec === spec) {
values.push(i);
} else {
// 如果不相同,先把目前的已经归总规格名完毕的临时数组,加入到所创建的临时规格表中
specValues.push(values);
// 切换curr规格值,再去进行下一次匹配
spec = aspec;
// 清空临时数组
values = [];
// 将当前的下标,加入到临时values,进行下一次归组
values.push(i);
}
}
// 将最后一组分类加入到临时规格表中
specValues.push(values);
// 根据临时规格列表生产货品规格
// 算法基于 https://blog.csdn.net/tyhj_sf/article/details/53893125
var productsIndex = 0;
var products = [];
// 所有的的相同的规格名数组的二级数组
var combination = [];
// 所有分类的长度
var n = specValues.length;
// 根据specValues的长度初始化出所有的combination
for (var s = 0; s < n; s++) {
combination[s] = 0;
}
// 初始化
var index = 0;
var isContinue = false;
// 排列组合~
do {
var specifications= [];
for (var x = 0; x < n; x++) {
var z = specValues[x][combination[x]];
// 推入每个规格的规格值
specifications.push(state.formState.specifications[z].value);
}
products[productsIndex] = {
id: productsIndex,
specifications: specifications,
price: 0,
number: 0,
sand: 0,
integral: 0,
url: '',
};
// ++index,赋值下一个products
productsIndex++;
index++;
combination[n - 1] = index;
for (var j = n - 1; j >= 0; j--) {
if (combination[j] >= specValues[j].length) {
combination[j] = 0;
index = 0;
if (j - 1 >= 0) {
combination[j - 1] = combination[j - 1] + 1;
}
}
}
// 退出循环的标志
isContinue = false;
for (var p = 0; p < n; p++) {
if (combination[p] !== 0) {
isContinue = true;
}
}
} while (isContinue);
// 赋值
state.formState.products = products;
};
每当我们修改规格时,例如规格的删除/编辑/添加,都需要调用此方法进行重新输出商品。