• [电商]商品发布规格组合算法


     1 //循环组合
     2 function generateGroup(arr) {
     3     //初始化结果为第一个数组
     4     var result= arr[0];
     5     //从下标1开始遍历二维数组
     6     for(var i=1;i<arr.length;i++){
     7         //使用临时遍历替代结果数组长度(这样做是为了避免下面的循环陷入死循环)
     8         var size= result.length;
     9         //根据结果数组的长度进行循环次数,这个数组有多少个成员就要和下一个数组进行组合多少次
    10         for(var j=0;j<size;j++){
    11             //遍历要进行组合的数组
    12             for(var k=0;k<arr[i].length;k++){
    13                 //把组合的字符串放入到结果数组最后一个成员中
    14                 //这里使用下标0是因为当这个下标0组合完毕之后就没有用了,在下面我们要移除掉这个成员
    15                 result.push(result[0]+","+arr[i][k]);
    16             }
    17             //当第一个成员组合完毕,删除这第一个成员
    18             result.shift();
    19         }
    20     }
    21     //打印结果
    22     console.log(result);
    23 }
    24 
    25 generateGroup([["红色","蓝色"],["X","XL"],["10m","20m"]]);

    商品发布规格组合这块是个很头疼的问题,毕竟是第一次接触电商项目开发,公司也没有大牛带队,项目开发成员总共就4个人,什么项目经验都没有的小青年,两个前端两个后端,商品发布这块相对其他页面比较麻烦,于是商品发布前端后端都被我承包了。。

    我们这个项目开发团队,看起来更像是个研发团队了,什么都不懂,什么都是瞎搞。。哎,也不知道最终是否能开发完成,,

    说下我的思路:

      开始时建立一个变量result,并把arr的第一个数组成员(arr是一个二维数组)赋值给它,然后把result作为基础依次与后面的数组成员进行组合,始终以result第0个成员去和目标组合,当组合完毕确定不再使用时移除掉这个下标为0的成员,这样最终result里只保留下了有用的数据,这里有点像是队列,先进先出的意思。

      例如:

      有数据:{a,b}{c,d}{e,f,g}

      初始化:result={a,b}

      第一次组合得到:a_c,a_d本轮组合结束后result为{a,b,a_c,a_d},删除a后result为{b,a_c,a_d},进行下一轮..

      第N次组合依次...

    这个是用递归的方式实现的:

     1 //递归组合
     2 function generateGroup2(arr){
     3     //判断二维数组长度是否大于1
     4     //如果大于1则去递归组合,否则返回第0个数组
     5     if(arr.length> 1){
     6         //创建结果数组,用于保存结果
     7         var result= new Array();
     8         //第一个二维数组元素作为初始数组
     9         var base= arr[0];
    10         //删除二维数组第0个数组
    11         arr.splice(0,1);
    12         //递归获取下一个数组
    13         var next= generateGroup2(arr);
    14         //遍历基数组
    15         for(var i=0;i<base.length;i++){
    16             //遍历递归获取的数组
    17             for(var j=0;j<next.length;j++){
    18                 //组合结果放入结果数组
    19                 result.push(base[i]+","+next[j]);
    20             }
    21         }
    22         //返回结果数组
    23         return result;
    24     }else{
    25         //返回第0个数组元素
    26         return arr[0];
    27     }
    28 }
    29 
    30 console.log(generateGroup2([["红色","蓝色"],["X","XL"],["10m","20m","30m"]]));

    说下递归的思路:

      从二维数组的最后一个元素开始组合,组合完毕返回给上一层继续组合,直到第一层递归执行完毕返回结果。按数组的倒序去组合。

      例如:

      有数据:{a,b}{c,d}{e,f,g}

      递归遍历这个数据,如果数据长度大于1则新建变量保留第一个元素,并移除这个数据中的第一个元素,传递给下一层递归,依次类推,直到这个数据的长度只剩下最后一个成员时,把最后这个成员返回给上层递归去组合,上层递归组合完毕返回给上上层递归组合,一直到第一层递归完毕。

    这就是我的思路,或许有更好的方法,如果你有更好的方式,请推荐给我,谢谢。

    调整算法后加入到项目中的案例:

     1 //循环方式组合
     2 function generateGroup(arr) {
     3     //初始化结果为第一个数组
     4     var result= new Array();
     5     //字符串形式填充数组
     6     for(var i=0;i<arr[0].length;i++){
     7         result.push(JSON.stringify(arr[0][i]));
     8     }
     9     //从下标1开始遍历二维数组
    10     for(var i=1;i<arr.length;i++){
    11         //使用临时遍历替代结果数组长度(这样做是为了避免下面的循环陷入死循环)
    12         var size= result.length;
    13         //根据结果数组的长度进行循环次数,这个数组有多少个成员就要和下一个数组进行组合多少次
    14         for(var j=0;j<size;j++){
    15             //遍历要进行组合的数组
    16             for(var k=0;k<arr[i].length;k++){
    17                 //把组合的字符串放入到结果数组最后一个成员中
    18                 //这里使用下标0是因为当这个下标0组合完毕之后就没有用了,在下面我们要移除掉这个成员
    19                 //组合下一个json字符串
    20                 var temp= result[0]+","+JSON.stringify(arr[i][k]);
    21                 result.push(temp);
    22             }
    23             //当第一个成员组合完毕,删除这第一个成员
    24             result.shift();
    25         }
    26     }
    27     //转换字符串为json对象
    28     for(var i=0;i<result.length;i++){
    29         result[i]= JSON.parse("["+result[i]+"]");
    30     }
    31     //打印结果
    32     console.log(result);
    33     return result;
    34 }
    35 generateGroup([[{id:1,value:"红色"},{id:2,value:"蓝色"}],[{id:3,value:"XX"},{id:4,value:"XXS"}],[{id:5,value:"10m"},{id:6,value:"20m"}]]);

    这样得到的结果是一个二维数组:[[Object { id=1, value="红色"}, Object { id=3, value="XX"}, Object { id=5, value="10m"}], [Object { id=1, value="红色"}, Object { id=3, value="XX"}, Object { id=6, value="20m"}], [Object { id=1, value="红色"}, Object { id=4, value="XXS"}, Object { id=5, value="10m"}], [Object { id=1, value="红色"}, Object { id=4, value="XXS"}, Object { id=6, value="20m"}], [Object { id=2, value="蓝色"}, Object { id=3, value="XX"}, Object { id=5, value="10m"}], [Object { id=2, value="蓝色"}, Object { id=3, value="XX"}, Object { id=6, value="20m"}], [Object { id=2, value="蓝色"}, Object { id=4, value="XXS"}, Object { id=5, value="10m"}], [Object { id=2, value="蓝色"}, Object { id=4, value="XXS"}, Object { id=6, value="20m"}]]

    每个内部数组对应一行表格数据,每一个对象对应一个单元格的数据。

    另外商城前台商品详情页的sku组合可参考:淘宝SKU组合查询算法实现

  • 相关阅读:
    SQLServer 事物与索引
    SQLServer 常见SQL笔试题之语句操作题详解
    测试思想-测试设计 测试用例设计之边界值分析方法
    测试思想-测试设计 测试用例设计之等价类划分方法
    测试思想-测试设计 测试用例设计之因果图方法
    测试思想-测试设计 测试用例设计之判定表驱动分析方法
    MySql 缓存查询原理与缓存监控 和 索引监控
    测试思想-测试设计 授客细说场景测试用例设计与实践
    产品相关 细说软件产品和业务 & 业务过程(流程) & 业务逻辑
    Postman Postman接口测试工具使用简介
  • 原文地址:https://www.cnblogs.com/hihtml5/p/6081145.html
Copyright © 2020-2023  润新知