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

 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组合查询算法实现

posted on 2016-11-19 18:06  代码ok  阅读(6501)  评论(0编辑  收藏  举报