前端电商 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类