前端电商 sku 的全排列算法
2022/5/3 14:42:40
本文主要是介绍前端电商 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 的全排列算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-30毕设私活神器
- 2024-05-30html
- 2024-05-09一定要避坑:关于微信H5分享,温馨提示你不要再踩坑了!!!
- 2024-05-09本地项目放到公网访问!炒鸡煎蛋!
- 2024-04-07金融企业区域集中库的设计构想和测试验证
- 2024-03-11前端CSS的工程化——掌握Sass这四大特性就够了
- 2024-02-21h5关联css样式(html怎么和css关联)-icode9专业技术文章分享
- 2024-02-07Firefox禁止远程字体加速网页加载及图标字体补充安装
- 2024-02-07一个菜鸡前端的3年总结-「2023」
- 2024-01-18最火前端Web组态软件(可视化)