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組合查詢算法實現
