[电商]商品发布规格组合算法
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组合查询算法实现