前端sku的实现:路径的判断以及代码的实现

本文深入探讨了前端SKU路径判断的实现方法,包括SKU与SPU的概念,如何通过遍历和矩阵转置等方式判断SKU路径的存在,以及代码实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于前端sku的实现:路径的判断

前提

网上有很多关于spu、sku的介绍
这里简单介绍一下spu与sku

SPU = Standard Product Unit (标准产品单位)SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。

SKU=stock keeping unit(库存量单位) 物理上不可分割的最小单位。

举个简单的例子就是
iPhone 11 是一个 SPU,

iphone 11 绿色 128GB 或者
iPhone 11 黑色 64GB 就是一个SKU(它们具有完整的规格属性)

如何理解sku路径?

sku路径的判断,总结来说是一句话:当前所要判断的元素,加上已选择的元素的总路径
比如
在这里插入图片描述
要判断金属灰,是否存在,则是金属灰的路径加上灌篮高手的路径是否存在,即 金属灰——灌篮高手,判断该路径是否包含在已有的路径。
同理
在这里插入图片描述
判断小号S 是否存在,则是判断 青芒色——灌篮高手——小号S 是否在已在路径中,进行样式的修改、可以为‘待选’状态,也可以为“静止”状态,
图中虚线为静止状态

这里的已有路径,是一开始后段所传来总的sku,进行整合而来的一个数组。实现的方法比较多,比如遍历、矩阵的转置等。

思路的实现

1、遍历每一个元素,把每一个元素的数据和行号扔进去判断(进行2 & 3操作)

2、新建一个空路径

3、遍历每一行(进行步骤 4 & 5|6 操作)

4、获得每一行的数据

5、(判断一)如果元素所在行符合遍历的那一行,YES:进行(判断一、1:)该元素是否是已选中的,YES:返回空路径。NO:合并路径

6、(判断一:NO)判断当前行是否存在数据(步骤3所记录的那个数据),有的话记录路径

简单来说,遍历每一个元素,拿该元素和已选择的元素进行路径合并,判断是否存在该路径(注:不能拿两个未选择加一个已选择进行路径的记录)

代码实现

这里的代码实现可以更好理解(注:这里的空路径的目的可以理解为选中状态,不进行“待选”与“禁用”的切换)

 judge(cell, x, y) {
   this._changeCurrentCellStatus(cell, x, y)
   // 这里传入每一个sku的具体规格(比如青芒色)以及所在行
   this.fenceGroup.eachCell((cell,x)=>{
     const path = this._findPotentialPath(cell, x)
     if(!path){
       return
     }
     // 获得是否存在该路径
     const isIn = this._isInDict(path)
     // 存在的话,置为可选,否则置为不可选
     if(isIn){
       this.fenceGroup.fences[x].cells[y].status = CellStatus.WAITING
     } else {
       this.fenceGroup.fences[x].cells[y].status = CellStatus.FORBIDDEN
     }
   })
 }
// 判断原sku是否存在该路径
 _isInDict(path) {
   return this.pathDict.includes(path)
 }

// 核心,返回每一条路径
_findPotentialPath(cell, x){
   // 这里的joiner是个工具类,用来连接字符串,‘#’不用在意
   const joiner = new Joiner('#')
   // 遍历每一行
   for(let i = 0; i < this.fenceGroup.fences.length; i++){
     // 获得当前行的数据
     const selected = this.skuPending.findSelectedCellByX(i)
     // 判断当前元素的行是否是目标所在一行
     if (x === i) {
       // 判断该元素是否是该行已选元素,如果是,则返回空路径
       if(this.skuPending.isSelected(cell,x)){
         return
       }
       // 如果不是,则合并路径
       const cellCode = this._getCellCode(cell.spec)
       joiner.join(cellCode)
     } else {
       // 如果当前行不是目标所在一行,进行当前行数据的判断,如果存在数据,合并路径
       if(selected) {
         const selectedCellCode = this._getCellCode(selected.spec)
         joiner.join(selectedCellCode)
       }
     }
   }
   return joiner.getStr()
 }

参考来源:
7七月:http://www.imooc.com/t/4294850

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值