[電商]商品發布規格組合算法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM