前端电商 sku 的全排列算法

什么是sku

针对电商而言:

1、SKU是指一款商品,每款都有出现一个SKU,便于电商品牌识别商品。

2、一款商品多色,则是有多个SKU,例:一件衣服,有红色、白色、蓝色,则SKU编码也不相同,如相同则会出现混淆,发错货。

SKU,定义为保存库存控制的最小可用单位,例如纺织品中一个SKU通常表示:规格、颜色、款式。 STOCK KEEP UNIT,这是客户拿到商品放到仓库后给商品编号,归类的一种方法。

聊聊常见的需求

我们有三个数组分别为

let names = ["星途 XT", "星途 XTL"]

let colors = ["黑色", "白色", "金色"]

let displacement = ["1.5L", "1.5T", "1.8L", "1.8T"]

最终输出结果为

[
	["星途 XT","黑色","1.5L"],
	["星途 XT","黑色","1.5T"],
	["星途 XT","黑色","1.8L"],
	["星途 XT","黑色","1.8T"],
	["星途 XT","白色","1.5L"],
	["星途 XT","白色","1.5T"],
	["星途 XT","白色","1.8L"],
	["星途 XT","白色","1.8T"],
	["星途 XT","金色","1.5L"],
	["星途 XT","金色","1.5T"],
	["星途 XT","金色","1.8L"],
	["星途 XT","金色","1.8T"],
	["星途 XTL","黑色","1.5L"],
	["星途 XTL","黑色","1.5T"],
	["星途 XTL","黑色","1.8L"],
	["星途 XTL","黑色","1.8T"],
	["星途 XTL","白色","1.5L"],
	["星途 XTL","白色","1.5T"],
	["星途 XTL","白色","1.8L"],
	["星途 XTL","白色","1.8T"],
	["星途 XTL","金色","1.5L"],
	["星途 XTL","金色","1.5T"],
	["星途 XTL","金色","1.8L"],
	["星途 XTL","金色","1.8T"]
]

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

解决思路

我们采取递归回溯法来解决这个问题,那么最重要的问题就是设计我们的递归函数

思路分解

以上文所举的例子来说,比如我们目前的属性数组就是:names、colors、displacement,首先我们会处理 names 数组,很显然对于每个属性数组,都需要去遍历它,然后一个一个选择后再去和 下一个数组的每一项进行组合。
我们设计的递归函数接受两个参数:

index 对应当前正在处理的下标,是 names 还是 colors 或是 displacement。
prev 上一次递归已经拼接成的结果,比如 ['星途 XT, ‘黑色’]。
进入递归函数:

  1. 处理属性数组下标为0: 假设在第一次 星途 XT, 那此时我们有一个未完成的结果状态,假设我们叫它prev, 此时prev = [“星途 XT”].

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

  3. 处理属性数组的下标2:那么就处理到 displacement 数组的了,并且我们拥有了 name + color 的 prev,在遍历 displacement 的时候继续递归的去把 prev 拼接成 prev.concat(displacement),也就是 [‘星途 XT’, ‘黑色’, ‘1.5L’],并且此时我们发现处理的属性数组下标已经到达了末尾,那么就放入全局的结果变量 res 中,作为一个结果。

上代码

	let names = ["星途 XT", "星途 XTL"]

	let colors = ["黑色", "白色", "金色"]

	let displacement = ["1.5L", "1.5T", "1.8L", "1.8T"]

   	let combine = function (...chunks) {
       console.log(chunks, '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)
               if (isLast) {
                   // 如果已经处理到数组的最后一项了 则把拼接的结果放入返回值中
                   res.push(cur)
               } else {
                   helper(chunkIndex + 1, cur)
               }
           }
       }

       // 从属性数组下标为 0 开始处理
       // 并且此时的 prev 是个空数组
       helper(0, [])

       return res
   	}

    console.log(combine(names, colors, displacement))

在这里插入图片描述
第一次进入递归流程。剩余流程可脑补

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在进行电商sku方面的提取测试时,可以考虑以下测试点: 1. SKU提取准确性:测试系统是否能够准确地从电商平台上提取商品的SKU(库存单位),即使商品信息形式各异或被隐藏。比如,测试系统是否可以提取商品页面上明确标注的SKU,或者通过分析商品URL、商品标题等其他方式来提取SKU。 2. SKU提取速度:测试系统在处理大量商品页面时,是否能够快速高效地提取SKU。此测试点中可以关注系统的响应速度和处理能力。例如,测试系统在提取100个或1000个商品SKU时所花费的时间。 3. SKU提取规则灵活性:测试系统是否具备灵活的SKU提取规则设置功能,方便用户根据实际需求自定义提取规则。这能够确保系统能够适应不同电商平台的页面结构和商品信息展示方式。 4. SKU提取结果验证:测试系统提取的SKU是否与实际商品信息一致。可以通过对比提取结果和电商平台上的商品SKU进行验证,确保提取的SKU是正确的。 5. SKU提取错误处理:测试系统对于提取错误的SKU是否能够给出明确的错误提示或处理机制。如果系统提取错误的SKU,是否能够通过一些修正方法或手动干预来纠正错误。 6. SKU提取覆盖面:测试系统的SKU提取功能是否能够覆盖多个电商平台,以及不同商品类别和种类。例如,测试系统在提取服装类商品的SKU时与提取电子产品类商品的SKU时的差异和表现。 以上是电商sku方面提取测试的一些常见测试点,可以根据具体需求和测试目标进行相应的调整和补充。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值