zoukankan      html  css  js  c++  java
  • 笛卡尔积算法的sku

    1.笛卡尔积在形式上比较容易理解,但作为按钮操作DOM的时候,我的思路大体还可以,有些偏差。看到这种矩行方阵,首先联想到二维数组,事实上这种方法完全可以实现,但是在性能和编码速度上都有弊端。

    2.以下是代码

      1 <!DOCTYPE html>
      2 <html>
      3     <head>
      4         <meta charset="UTF-8">
      5         <title></title>
      6         <style>
      7             input{
      8                 width: 50px;
      9                 height: 35px;        
     10             }
     11             .checked{
     12                 background: orange;
     13             }
     14         </style>
     15     </head>
     16     <body>
     17         <div class="container">
     18               <div class="row">
     19                 <input type="button" value="红" />
     20                 <input type="button" value="黄" />
     21                 <input type="button" value="蓝"/>
     22                 <input type="button" value="白"/>
     23                 <input type="button" value="军绿"/>
     24                 
     25             </div>
     26         
     27             <div class="row">
     28                 <input type="button" value="xl"/>
     29                 <input type="button" value="xxl"/>
     30                 <input type="button" value="xxxl"/>
     31             </div>
     32         
     33             <div class="row">
     34                 <input type="button" value="纯棉"/>
     35                 <input type="button" value="牛仔"/>
     36                 <input type="button" value="针织"/>
     37             </div>
     38             
     39             <div class="row">
     40                 <input type="button" value="A"/>
     41                 <input type="button" value="B"/>
     42                 <input type="button" value="C"/>
     43                 <input type="button" value="D"/>
     44                 <input type="button" value="E"/>
     45                 <input type="button" value="F"/>
     46                 <input type="button" value="H"/>
     47             </div>
     48           </div>    
     49     
     50         <div class="box">
     51             
     52         </div>
     53         <script src="jquery-3.2.1.min.js"></script>
     54         <script type="text/javascript">
     55             (function(){  
     56                 //两个数组的笛卡尔积
     57                 var Dicar = function(a,b){  
     58                     var ret=[];  
     59                     for(var i=0;i<a.length;i++){  
     60                         for(var j=0;j<b.length;j++){  
     61                         ret.push(multi(a[i],b[j]));  
     62                         }  
     63                     }  
     64                     return ret;  
     65                 }  
     66                 var multi = function(a,b){  
     67                     if(!(a instanceof Array))  
     68                         a = [a];  
     69                     var ret = Array.call(null,a);  
     70                     ret.push(b);  
     71                     return ret;  
     72                 }  
     73                 //递归求笛卡尔最后结果  
     74                 multiDicar = function(data){  
     75                     var len = data.length;  
     76                     if(len == 0) {
     77                         return []; 
     78                     }else if(len == 1){
     79                         return data[0];    
     80                     }else{  
     81                         var r=data[0];  
     82                         for(var i=1;i<len;i++){
     83                             var s = Dicar(r,data[i])
     84                             if(s.length>0){
     85                                 r=s;
     86                             }
     87                         }  
     88                         return r;  
     89                     }  
     90                 }  
     91             })();  
     92         
     93         
     94             //给按钮添加选中取消标志
     95             $(".container .row input").on("click",function(){
     96                 $(this).toggleClass("checked");
     97             });
     98             
     99             
    100             (function(){    
    101                 //获取矩阵按钮
    102                 function getBtn(ele){
    103                     var arr=[];
    104                     var contain = $(ele);
    105                     for(let i=0;i<contain.length;i++){
    106                         arr.push($.makeArray(contain[i].children));
    107                     }
    108                     return arr;
    109                 }
    110                 //生成二维数组
    111                 var data = getBtn(".container .row"); 
    112     
    113                 //判断点击的元素是否在二维数组中
    114                 function getIndex(ele,map){
    115                     var res=[];
    116                     for(let i=0;i<map.length;i++){
    117                         for(let j=0;j<map[i].length;j++){
    118                             if(map[i][j] == ele){
    119                                 res = [i,j];
    120                             }
    121                         }
    122                     }
    123                     return res;            
    124                 }
    125                
    126                //生成结果二维数组
    127                 var checked=[];
    128                 for(let i = 0;i<data.length;i++){
    129                     checked[i] = []; 
    130                 } 
    131                 
    132                 //处理结果二维数组中的断层
    133                 //如果有中间一行没数据,就截断阵列
    134                 function deal(checked){
    135                     if(checked[0].length == 0){
    136                         return [[]]
    137                     }
    138                     for(let i=0;i<checked.length;i++){         
    139                         if(checked[i].length == 0){
    140                             return checked.slice(0,i);
    141                         }
    142                     }
    143                     return checked;    
    144                 }
    145                 
    146                 //删除数组的元素
    147                 function removeByValue(arr, val) {
    148                   for(var i=0; i<arr.length; i++) {
    149                     if(arr[i] == val) {
    150                       arr.splice(i, 1);
    151                       break;
    152                     }
    153                   }
    154                 }
    155     
    156                 //绑定点击事件
    157                 $(".container .row input").on("click",function(){
    158                     $(".box").empty();
    159                     var _this=$(this);
    160                     //判断在哪行那列
    161                     var res = getIndex(_this[0],data);
    162                     
    163                     //判断是否是取消
    164                     //如果数据已经存在,就把它删除 ,bug在于按钮的文字不能重复
    165                     if(($.inArray(_this.val(),checked[res[0]])) !==-1){
    166                         removeByValue(checked[res[0]],_this.val());
    167                     }else{
    168                         checked[res[0]].push(_this.val());
    169                     }
    170                     //做笛卡尔积的结果
    171                     var r = multiDicar(deal(checked));
    172                     for(var i=0;i<r.length;i++){  
    173                         $(".box").append("("+r[i]+")"+"<br>")
    174                     }  
    175                 })
    176             })();
    177         </script>
    178     </body>
    179 </html>
  • 相关阅读:
    本地blast用法
    linux挂载移动硬盘
    酶设计软件rosetta安装
    redhat 6.7 安装nvidia显卡驱动时出现的问题
    分子模拟软件Schrodinger Suites 2015安装
    Python_二维数组
    Python_递归
    Python_装饰器
    Python_生成器generator
    Python_迭代器
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/7246966.html
Copyright © 2011-2022 走看看