最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • sku选择解决方案

    正文概述 掘金(winljm001)   2021-01-08   419

    介绍

    一个看似简单的sku里面的水也是蛮深的,被同一个问题烦恼你三次的时候就要想解决方案,在web端还是移动端都会遇到,所以就有了下面的sku选择解决方案 思路来源:hooray.github.io/posts/8b2bd… 当我看到这篇文章当中的所有规格列出来的列表的时候就有了一些想法

    目标

    • 传入当前选中的规格来确定各个规格是否可选中
    • 传入当前选中的规格确定当前选中的具体哪一个sku

    思路

    通过sku列表即可得到所有的用户能选中的状态的集合,这样提前把这些集合给得到(不可否认的是这个集合在规格多的时候会很大,在这里空间和时间我选择时间),当用户选择规格时,直接去map前面得到的集合(这里的时间成本理论上就跟从对象里取一个key一样的成本),就可以得到sku所有的可能性,也就得到了当前哪些规格可以选中与否

    实现

    商品的数据:sku列表和规格列表

    const skuListData = [
      { specIds: ["100", "010"], stock: 12, price: 1, img: "1" },
      { specIds: ["100", "020"], stock: 12, price: 1, img: "1" },
      { specIds: ["200", "020"], stock: 12, price: 1, img: "1" },
    ];
    
    const specListData = [
      {
        name: "等级",
        items: [
          { name: "一级", id: "100" },
          { name: "二级", id: "200" },
        ],
      },
      {
        name: "品牌",
        items: [
          { name: "农夫山泉", id: "010" },
          { name: "潘苹果", id: "020" },
        ],
      },
    ];
    

    如何得到所有的用户能选中的状态的集合

    通过下面的两个函数得到

    function arrayCombine(targetArr: any) {
      var resultArr = [];
      for (var n = 0; n <= targetArr.length; n++) {
        var flagArrs = getFlagArrs(targetArr.length, n);
        while (flagArrs.length) {
          var flagArr = flagArrs.shift() || [];
          //   var combArr = Array(targetArr.length);
          var combArr = [];
          for (var i = 0; i < targetArr.length; i++) {
            if (flagArr[i]) {
              combArr.push(targetArr[i]);
            }
          }
          resultArr.push(combArr);
        }
      }
      return resultArr;
    }
    // 从m中取n的所有组合
    function getFlagArrs(m: any, n: any) {
      var flagArrs = [],
        flagArr = [],
        isEnd = false;
      for (var i = 0; i < m; i++) {
        flagArr[i] = i < n ? 1 : 0;
      }
      flagArrs.push(flagArr.concat());
      // 当n不等于0并且m大于n的时候进入
      if (n && m > n) {
        while (!isEnd) {
          var leftCnt = 0;
          for (var i = 0; i < m - 1; i++) {
            if (flagArr[i] === 1 && flagArr[i + 1] === 0) {
              for (var j = 0; j < i; j++) {
                flagArr[j] = j < leftCnt ? 1 : 0;
              }
              flagArr[i] = 0;
              flagArr[i + 1] = 1;
              var aTmp = flagArr.concat();
              flagArrs.push(aTmp);
              if (aTmp.slice(-n).join("").indexOf("0") == -1) {
                isEnd = true;
              }
              break;
            }
            flagArr[i] == 1 && leftCnt++;
          }
        }
      }
      return flagArrs;
    }
    

    传入sku列表的规格组合到arrayCombine的结果

    sku选择解决方案

    解释:比如我的第一个sku数据的 specIds: ["100", "010"] 这个sku就是由100,010两个规格id组合起来的,那么他在选择这个sku的过程中所有的情况就是上面arrayCombine的结果的第一条,分别为不选,选择100规格,选择010规格,选择100规格和010规格四个情况

    所以再把上面的规格组合去个重,就得到了用户选择规格所有的情况,当用户选择规格的时候,就可以直接提前知道他当前可选那些sku,以此来得到当前那些规格可选与否

    结尾

    上面的思路讲的就是核心的思路,具体的实现,比如我知道那些sku可选怎么判断规格可选呢就没有具体再展开讲了,如果有兴趣继续看下去移步:github.com/winljm001/s…

    可以直接引入作者写的库 sku-status-class 用上面的数据试试(实际使用的数据字段不一样再使用的时候自己map一次就行了)

    功能上是没有问题的,经过思考也有可以优化的点,后面有bug或者空了再继续迭代优化

    使用方法:

    import Sku from "sku-status-class";
    const selected = ["100", "010"];
    const a = new Sku(skuListData, specListData);
    // 获取规格状态
    console.log(a.getSpecListStatus(selected));
    // 获取选中的规格
    const a = new Sku(skuListData, specListData);
    // console.log(a.getSkuGoods(selected));
    

    上面的使用结果就会得到

    sku选择解决方案

    有了specStatus你就可以在页面上渲染当前规格的状态为:选中、可选、不可选


    起源地下载网 » sku选择解决方案

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元