基于Vue的淘宝SKU组合算法

现有需求,当点击颜色时进行校验,若蓝色6.0寸无库存时禁选。 先上效果截图:

当前规格组合中 蓝色6寸 和 黑色中6寸 的库存均为0.

后台返回数据如下图:

实现思路: 例如:当选择蓝色时,进行循环遍历组合。组合结果为: 蓝黑,蓝5.5寸,蓝6.0寸,再进行校验,拿出对应组合的库存,判断库存为0时禁选

第一步: 对当前显示在页面上的spu进行重新组合

    this.goodsInfo.skuSpec.forEach(it => { // 重新组合sku
        it.goodsSpecVals.forEach(i => {
            this.$set(i, 'children', [])
            this.goodsInfo.skuList.forEach(item => {
              if (item.skuName.includes(i.goodsSkuSpecValName)) {
                i.children.push(item.skuName)
              }
            })
        })
    })
    解析:sku组合中含有spu,就将将该条sku信息拼入spu对象里,键为children 如图:
复制代码

第二步: 此时已经循环展示在页面上了,要做的是点击进行处理, 此处it为当前的goodsSpecVals中的一项,index为skuSpec层中的索引,idx为当前goodsSpecVals的索引

chooseSku(it, index, idx) {
    if (it.stock === 0) return // 判断库存为0时返回
    // 选中的规格数组组成:[蓝色,5.5寸]
    if (this.selectArr[index] === it.goodsSkuSpecValName) {
        // 再次点击时取消选中
        this.$set(this.selectArr, index, '')
        this.formData.skuId = '' // 清空将要传给后台的skuId
    } else this.$set(this.selectArr, index, it.goodsSkuSpecValName)
    if (this.selectArr.length === this.goodsInfo.skuSpec.length) {
        // 选取了所有的规格时 拿去skuId
        let str = ''
        this.selectArr.forEach(item => {
            str += '_' + item
        })
        str = str.slice(1)
        // 所有规格都选了时,进行匹配skuId,此处数据用于传给后台
        this.goodsInfo.skuList.forEach(item => { // 匹配skuId
            if (item.skuName === str) this.formData.skuId = item.id
        })
    }
    this.getData(this.selectArr, this.goodsInfo.skuSpec, this.goodsInfo.skuList) // 校验库存
}
复制代码

第三步: 进行循环判断哪些sku组合库存为空

getData(selectArr, skuSpec, skuList) {
  console.log(skuSpec)
  let checkLen = skuSpec.length - 1 
  // 3行规格 选2行时校验,2行规格,选1行时校验
  if (selectArr < checkLen) return
  skuSpec.forEach((item, index) => {
    item.goodsSpecVals.forEach((it, idx) => {
      let c = this._deepCopy(selectArr)
      // 这里进行循环组合, 例如:红色_5.5寸,红色_6.0寸
      c[index] = it.goodsSkuSpecValName
      // 拿到我们想要的sku组合,例如:红色_5.5寸 
      let skuName = this.getCid(c, skuSpec, skuList)
      console.log(skuName, 'skuNameskuNameskuName')
      // 根据我们拿到的sku组合 红色_5.5寸进行查库存
      let stock = this.getStock(skuName, skuSpec, skuList)
      it.stock = stock
    })
  })
}
复制代码

第四步 拿出我们需要的组合类型

getCid(c, skuSpec, skuList) {
    // 首先进行判断,避免单纯的红色,蓝色也进行循环。
    if (c.length !== skuSpec.length) return
    let cStr = c.join('_')
    // 对后台传来的sku组合进行循环遍历,若匹配上,则返回这个组合的skuName,例如:红色_5.5寸 
    for (let i in skuList) {
        if (skuList[i].skuName === cStr) {
        return skuList[i].skuName
        }
    }
}
复制代码

第五步 根据我们拿到的组合进行查询库存

getStock(skuName, skuSpec, skuList) {
    console.log(skuName, 'skuName')
    if (!skuName) return
    for (let a in skuSpec) { // 我们拼接的数组,见第三张图
        for (let b in skuSpec[a].goodsSpecVals) {
            // 对每项Spu中children进行循环,若此children中包含skuName,则返回当前组合的库存到当前Spu中
            // 例如点击红色时,遍历匹配到红色_5.5寸,红色库存则为红色_5.5寸的库存 300,5.5寸此时库存也为300。以此类推可以得出6.0寸的库存。
            if (skuSpec[a].goodsSpecVals[b].children.indexOf(skuName) !== -1) {
                for (let i in skuList) {
                    if (skuList[i].skuName === skuName) {
                        console.log(skuList[i], 'skusku')
                        return skuList[i].stock
                    }
                }
            }
        }
    }
  console.log(skuSpec, 'skuSpecskuSpec')
}
复制代码

第六步 最后就比较简单了,在页面上我们循环判断下当前的库存是否为0就OK啦

文章的最后

初次写文章,请多多包涵,有不明白的欢迎留言指出(ps:掘金都是大神,不允许看不懂的情况,手动滑稽) 此方法完全还可以继续优化,也欢迎提出共同学习啊~ 如果有其他方法也欢迎分享

转载于:https://juejin.im/post/5c0e312ae51d4534655d937c

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值