订单sku规格选择
参考 https://juejin.cn/post/6914163217124032525
/* 重新实现笛卡尔积 传入的数组 '为空', '长度为1', '长度大于1' 三种情况 分别处理
入参数组格式: [
{ attr:"颜色", valueList:["黑","白"] },
{ attr:"尺寸", valueList:["大","中"] }
]
返回的数组格式:[
{"颜色":"黑","尺寸":"大"},
{"颜色":"黑","尺寸":"中"},
{"颜色":"白","尺寸":"大"},
{"颜色":"白","尺寸":"中"}
]
*/
function generateBaseData(arr) {
if (arr.length === 0) return []
if (arr.length === 1) {
/**
* [
{ attr:"颜色", valueList:["黑","白"] },
{ attr:"尺寸", valueList:["大","中"] }
]
*/
let [item_spec] = arr//arr 是数组
return item_spec.valueList.map(x => {
return {
[item_spec.attr]: x
}
})
}
if (arr.length >= 1) {
/**
* 菜鸟平台 https://www.runoob.com/jsref/jsref-reduce.html
* total 必需。初始值, 或者计算结束后的返回值。
currentValue 必需。当前元素
当前函数解释
* accumulator 第二次处理后的数据
* spec_item 当前需要处理的数据
*/
return arr.reduce((accumulator, spec_item) => {
let acc_value_list = Array.isArray(accumulator.valueList) ? accumulator.valueList : accumulator
let item_value_list = spec_item.valueList
let result = []
console.log(`acc_value_list`, acc_value_list)
console.log(`item_value_list`, item_value_list)
for (let i in acc_value_list) {
for (let j in item_value_list) {
let temp_data = {}
if (acc_value_list[i].constructor === Object) {
// 如果是对象 说明商品·规格还没·组合过
/**
* [
{ '颜色': '黑', '尺寸': '大' },
{ '颜色': '黑', '尺寸': '中' },
{ '颜色': '白', '尺寸': '大' },
{ '颜色': '白', '尺寸': '中' }
]
*/
temp_data = {
...acc_value_list[i],
[spec_item.attr]: item_value_list[j]
}
// 否则如果是字符串
} else {
// 如果不是对象 说明商品·规格还没·组合过一次
/**
* acc_value_list [ '黑', '白' ] 数据类型是这种的
item_value_list [ '大', '中' ]
*/
temp_data[accumulator.attr] = acc_value_list[i]
temp_data[spec_item.attr] = item_value_list[j]
}
result.push(temp_data)
}
}
return result
})
}
}
订单sku规格选择
isDisabledSku(valueId) {
if (this.skuValueId.length === 0) {
return;
}
// 判断库存为0的禁止点击,也可以考虑换成淘宝的模式(允许点击,但提示库存为0、确定按钮改成库存不足禁止下一步操作)
let isDisabled = false;
this.combs.forEach(item => {
if (item.skuNum === 0) {
//如果sku有为0的就跟当前 valueId对比是否有这个id
console.log(item.comb.split(','));
const itemComb = new Set(item.comb.split(','));
if (itemComb.has(valueId + '')) {
//有id 就对比当前保存的skuid 跟当为0的对比如果长度一样就返回true 说明有 反之没有
const intersect = this.skuValueId.filter(x => itemComb.has(x + ''));
console.log(intersect);console.log(itemComb);
isDisabled = intersect.length + 1 === itemComb.size;
}
}
});
return isDisabled;
},