惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - 亲,注意身体

magento 数据清理 magento top menu edit CookieConter 转换为string magento sitemap cms page remove home and generate sitemap error magento toplink blank li magento 语言包 magetno awblog auto generate title id, js replace magento moneybooker 操作 JS 正则 magento checkout require moneybooker api/mqi query magento 记录蜘蛛爬行日志 magento moneybooker redirect 添加信任站点 bat 设置信任站点等级 moneybooker api 文档 magento htaccess Navicat 注册码,序列号 magento 修改订单号 Magento 删除所有订单 适于于1.4+
js 数组 组合(转)
亲,注意身体 · 2012-05-07 · via 博客园 - 亲,注意身体

例如形如 var versions=[
       ["1","2"],
       ["3","4","5"],
       ["6","7","8"] ,
       ["9"]

       。。。
    ]           的二维数组,长度不定,每维元素个数不定。要找出例如 1369,1379,1478,1489等,即类似数组中每行依次任取一个元素后的所有组合来,可用如下方法。先取数组第一行的第一个元素1,2,分别当 成树的的根结点,然后把第二行的各元素3,4,5分别作为以1和2为顶点的树子节点,然后用第三行的各元素6,7,8分别作为3,4,5的子节点。依次, 知道,数组结束。结果如下图所示。最后,数组第一行有几个元素就有几颗数。

            易知,从根节点到叶节点各条路径上的数字连接起来的串即为我们需要的所有组合。

     

          。。。         。。。

     至于代码实现,可以如下这样做,只是需要的空间比较大。方法是:开始时,把所有树位于同一层次的元素,这里是1,2,用一个数组arr0i(0,是第一 层,i代表第几棵树)保存起来,然后处理第二层的元素3,4,5时,首先建立空的数组arr1i,再去遍历第一层形成的数组arr0i各元素,把其中的每 个元素都与3,4,5连接后的结果存入新数组arr1i中。依此直到叶子节点层。比如:最后的数arrn0组中的元素即为第1 棵树产生的字符组合,也就是以1开头的那些字符组合。我是用javascript的数组实现的。下面贴出代码:

<script language="javascript">
 
   var arrLen;   //versions数组长度
   var comCollction=new Array(); //versions数组产生的所有组合值
   //按照下面数组样式,任意添加行,列数(每个元素值都不同,每行元素个数不要求相同)

   var versions=[
  ["1","2"],
  ["3","4","5"],
  ["6","7"],
    ["8"]
 ];
 
   arrLen=versions.length;
   
   function printCombination(){
     
       var k;
       var cur_count=0;
    var len0=versions[0].length;
    //初始化第一个数组,即用versions第一行值生成数组arr0i
    for(var i=0;i<len0;i++){
     eval("var arr"+0+i+"= new Array()");
     eval("arr"+0+i)[0]=versions[0][i];
     
    }
    //循环versions的剩余行 (1至arrLen)
    for(var m=1;m<arrLen;m++){
       //循环arr0i
       for(var n=0;n<len0;n++){
             k=0;
            cur_count=0;
            eval("var arr"+m+n+"= new Array()");
        while(true){
             eval("var temp=arr"+(m-1)+n+"[k]");
             //数组arr(m-1)n[k]的值未定义时,跳出
             if(eval("temp==undefined")){
                   break;
             }
             //versions数组的第m行的每个值与arr(m-1)n[k]连接,保存到新数组arrmn[cur_count]
            for(var j=0;j<versions[m].length;j++){
                   eval("arr"+m+n)[cur_count++]=eval("arr"+(m-1)+n)[k]+versions[m][j];//此处可添加分隔符
             }
        
             k++;
       }
     }
     if(m==arrLen-1){ //最后一轮循环结束时,将产生的所有组合赋值给全局数组comCollction
      var cnt=0;
         for(var w=0;w<len0;w++){
                  for(var t=0;t<eval("arr"+m+w).length;t++){
                        //alert(eval("arr"+m+w)[t]);
                        comCollction[cnt++]=eval("arr"+m+w)[t];
                  }
         }
      
     }
    } 
   }

</script>