前端电商 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中,作为一个结果
编码实现
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
标签:sku,prev,64g,算法,let,iPhone,数组,电商,256g 来源: https://www.cnblogs.com/zyx-blog/p/16218292.html