前端电商 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 的全排列算法的更多相关文章
- Vue电商SKU组合算法问题
前段时间,公司要做“添加商品”业务模块,这也算是电商业务里面的一个难点了. 令我印象最深的不是什么“组合商品”.“关联商品”.“关联单品”,而是商品SKU的组合问题. 这个问题特别有意思,当时虽然大体 ...
- 电商sku商品推荐
1.逻辑回归LR进行实时离线三级品类训练. 2.通过用户对于实时.离线三级品类的偏好进行召回. 3.通过人的特征.sku特征.人sku交互特征.以及位置手机特征通过gbdt模型进行点击量预估.
- 用微信小程序做一个小电商 sku
效果展示图 功能点概述 图一功能点有 搜索 轮播图 商品展示 图二功能点 导航栏 加入购物车 图四功能点 评论点 图五购物车 复选框 ( 全选全不选 ) 即点即改 总计结算 功能详解 1.A(搜索) ...
- 42、生鲜电商平台-商品的spu和sku数据结构设计与架构
说明:Java开源生鲜电商平台中商品的spu和sku数据结构设计与架构,包括数据库图标与架构分析. 1. 先说明几个概念. 电商网站采用在商品模块,常采用spu+sku的数据结构算法,这种算法可以将商 ...
- Java生鲜电商平台-商品的spu和sku数据结构设计与架构
Java生鲜电商平台-商品的spu和sku数据结构设计与架构 1. 先说明几个概念. 电商网站采用在商品模块,常采用spu+sku的数据结构算法,这种算法可以将商品的属性和商品的基本信息分离,分开维护 ...
- Spark大型电商项目实战-及其改良之番外(1)-将spark前端页面效果高效拷贝至博客
Spark大型电商项目实战-及其改良这个系列的时间轴展示图一直在变....1-3篇是用图直接表示时间轴,用一段简陋的html代码表示时间表.第4篇开始才是用比较完整的前端效果,能移动.缩放时间轴,鼠标 ...
- php 电商系统SKU库存设计
sku 全称为:Stock Keeping Unit,是库存进出计量的基本单元. 我们一般会在电商网站基本都会看到 比如淘宝,JD 淘宝和JD的 方式可能不一样,因为我不清楚他们具体是如何设计的, J ...
- 前端JS电商放大镜效果
前端JS电商放大镜效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝
web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...
- SpringBoot电商项目实战 — 商品的SPU/SKU实现
最近事情有点多,所以系列文章已停止好多天了.今天我们继续Springboot电商项目实战系列文章.到目前为止,整个项目的架构和基础服务已经全部实现,分布式锁也已经讲过了.那么,现在应该到数据库设计及代 ...
随机推荐
- 阶梯场景jp@gc - Stepping Thread Group (deprecated)
1.新建线程,添加配置元件.监听器 由上可见: 需要启动100个线程, 然后间隔30s就持续5s去启动10个线程, 那么就需要这样重复操作10次,才能100个线程全部启动. 最后整体100个线程持续运 ...
- ap,路由器,交换机
第二段测试实习啦,今天看到测试用例里边的AP愣了一下哈哈哈
- express的使用:web开发(四)
1.开发模式 1.服务端渲染 2.前后端分离 2.身份认证 1.服务端渲染推荐使用session认证机制 2.前端后端分离建议使用JWT认证机制 3.http协议的无状态性 4.cookie特性 1. ...
- Linux 在miniconda和anaconda同时安装时,卸载miniconda
1. 找到miniconda目录,删除. rm -rf miniconda3/ 2. 编辑bashrc sudo vim .bashrc setup路径改回anaconda3的,注释掉"&g ...
- 靶场练习3: Funbox2
信息收集阶段 扫描端口 sudo nmap -p- -n -v -sS --max-retries=0 172.16.33.30 发现开放端口21,22,80,扫描版本 sudo nmap -p21, ...
- NRF52832中文资料+蓝牙芯片
[产品应用] Nordic Semiconductor发布采用微型封装尺寸的高性能单芯片低功耗蓝牙SoC器件,瞄准新一代可穿戴产品和空间受限的loT应用.[产品说明]nRF52832晶圆级芯片尺寸封装 ...
- 关于CMDB
关于CMDB: CMDB运维管理平台是由CMDB开发团队,针对目前服务器运维.监控,批量管理提出的一个开源. 易用.实用的跨平台服务器运维管理平台. 统筹来说cmdb就是将已有的规则化运维技术规则到运 ...
- Android版本功能
Android 1.0 2008年9月23日,发布Android操作系统中的第一个正式版本:Android 1.0(Astro"铁臂阿童木").全球第一台Android设备HTC ...
- 51电子-STC89C51开发板:安装KEIL
全部内容,请点击: 51电子-STC89C51开发板:<目录> --------------------------- 正文开始 --------------------------- ...
- SwiftUI笔记
@Published 标记对象定义的属性变更可以被监听,当对应字段变化时会触发对象 objectWillChange 通知,订阅了该属性的View也会收到值改变的通知 /// A type that ...