sku算法

订单sku规格选择 参考 https://juejin.cn/post/6914163217124032525open in new window

/* 重新实现笛卡尔积 传入的数组 '为空', '长度为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
        })
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

订单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;
	  },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21