前端电商 sku 的全排列算法

需求

需求描述起来很简单,有这样三个数组:

let names = ["iPhone",'iPhone xs']

let colors = ['黑色','白色']

let storages = ['64g','256g']

需要把他们的所有组合穷举出来,最终得到这样一个数组:

[

["iPhone X", "黑色", "64g"],

["iPhone X", "黑色", "256g"],

["iPhone X", "白色", "64g"],

["iPhone X", "白色", "256g"],

["iPhone XS", "黑色", "64g"],

["iPhone XS", "黑色", "256g"],

["iPhone XS", "白色", "64g"],

["iPhone XS", "白色", "256g"],

]

由于这些属性数组是不定项的,所以不能简单的用三重的暴力循环来求解了

思路

如果我们选用递归溯法来解决这个问题,那么最重要的问题就是设计我们的递归函数

思路分解

以上文所举的例子来说,比如我们目前的属性数组就是 names,colors,storages,首先我们会处理names数组

很显然对于每个属性数组 都需要去遍历它 然后一个一个选择后再去和下一个数组的每一项进行组合

我们设计的递归函数接收两个参数

index 对应当前正在处理的下标,是names还是colors 或者storage。

prev 上一次递归已经拼接成的结果 比如['iphoneX','黑色']

进入递归函数:

1 处理属性数组的下标0:假设我们在第一次循环中选择了iphone XS 那此时我们有一个未完成的结果状态,假设我们叫它prev,此时prev = ['iphone Xs']。

2 处理属性数组的下标1: 那么就处理到colors数组的了,并且我们拥有prev,在遍历colors的时候继续递归的去把prev 拼接成prev.concat(color),也就是['iphoneXs','黑色'] 这样继续把这个prev交给下一次递归

3 处理属性数组的下标2: 那么就处理到storages数组的了 并且我们拥有了 name+ color 的prev,在遍历storages的时候继续递归的去把prev拼接成prev.concat(storage)

也就是['iPhoneXS','黑色','64g'],并且此时我们发现处理的属性数组下标已经达到了末尾,那么就放入全局的结果变量res中,作为一个结果

编码实现
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
let names = ['iphoneX',"iPhone XS"]
 
let colors = ['黑色','白色']
 
let storages = ['64g','256g']
 
let combine = function(...chunks){
 
    let res = []
 
    let helper = function(chunkIndex,prev){
 
        let chunk = chunks[chunkIndex]
 
        let isLast = chunkIndex === chunks.length -1
 
        for(let val of chunk){
 
            let cur = prev.concat(val)
 
            // ['iphoneX','黑色','64g'],['iphoneX','黑色','256g'],['iphoneX','白色','64g']
 
            if(isLast){
 
                // 如果已经处理到数组的最后一项 则把拼接的结果放入返回值中
 
                res.push(cur)
 
            }else{
 
                helper(chunkIndex+1,cur)
 
            }
 
        }
 
    }
 
    //从属性数组下标为0开始处理
 
    // 并且此时的prev是一个空数组
 
    helper(0,[])
 
    return res
 
}
 
console.log(combine(names,colors,storages));
 
["iphoneX", "黑色", "64g"]
 
["iphoneX", "黑色", "256g"]
 
["iphoneX", "白色", "64g"]
 
["iphoneX", "白色", "256g"]
 
["iPhone XS", "黑色", "64g"]
 
["iPhone XS", "黑色", "256g"]
 
["iPhone XS", "白色", "64g"]
 
["iPhone XS", "白色", "256g"]

  原文https://www.it610.com/article/1450380549762924544.htm

posted @   枫若  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示