1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        多個(gè)數(shù)組的排列組合

        共 2942字,需瀏覽 6分鐘

         ·

        2022-01-07 21:41


        現(xiàn)在有一批手機(jī),其中顏色有['白色','黑色','金色'];內(nèi)存大小有['16G','32G','64G'],版本有['移動(dòng)','聯(lián)通','電信'],要求寫(xiě)一個(gè)算法,實(shí)現(xiàn)[['白色','16G','移動(dòng)'], ['白色','16G','聯(lián)通'] ...]這樣的組合,擴(kuò)張,如果后面還有參數(shù),比如再加一個(gè)['國(guó)行','港版'],不改程序一樣可以執(zhí)行!


        不知道要實(shí)現(xiàn)的需求大家聽(tīng)懂了沒(méi)有,下面我會(huì)一步步實(shí)現(xiàn),教大家怎么寫(xiě):


        最后得到的結(jié)果是一個(gè)數(shù)組里面包含若干個(gè)數(shù)組,看著挺復(fù)雜的,我們先實(shí)現(xiàn)一個(gè)簡(jiǎn)化版的,數(shù)組里面不是數(shù)組,而是字符串連接的結(jié)果,嗯,先一步步來(lái)吧:


        第一步,想想通過(guò)什么技術(shù)來(lái)實(shí)現(xiàn),你看這數(shù)組之間不斷的重組,很容易想到用回調(diào)函數(shù),一遍一遍的執(zhí)行,大致知道用什么技術(shù),接下來(lái)就是寫(xiě)思路了,看看下面:


        // 執(zhí)行組合排列的函數(shù)function doExchange(arr){
        }
        //執(zhí)行var arr = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']];var arr1 = [['a','b','c']];//doExchange(arr);console.log(doExchange(arr));


        吶,我們建一個(gè)函數(shù) doExchange(),表示我們執(zhí)行排序的主函數(shù),然后當(dāng)執(zhí)行 arr 的時(shí)候,輸出['a1x','a1y' ...]這樣的結(jié)果,如果是 arr1 呢?我們需要輸出['a','b','c'],這好理解哈,現(xiàn)在的重點(diǎn)就是這個(gè)主函數(shù)了,下面主要講主函數(shù)的實(shí)現(xiàn)過(guò)程。


        // 執(zhí)行組合排列的函數(shù)function doExchange(arr){  var len = arr.length;  // 當(dāng)數(shù)組大于等于2個(gè)的時(shí)候  if(len >= 2){
        }else{ return arr[0]; }}


        我們的思路是,當(dāng)參數(shù)里面的數(shù)組長(zhǎng)度大于2個(gè),比如2個(gè),3個(gè)或更多,就執(zhí)行我們的組合代碼,否則只有一個(gè),就直接輸出來(lái)唄。


        如果是大于2個(gè)呢?我們的思路是先進(jìn)行第一個(gè)和第二個(gè)的合并,2個(gè)數(shù)組合并成一個(gè)數(shù)組,然后這個(gè)數(shù)組再放到參數(shù)數(shù)組中第一個(gè)位置,把原來(lái)前兩個(gè)去掉,相當(dāng)于是用這個(gè)數(shù)組替換前兩個(gè),沒(méi)聽(tīng)懂哈,沒(méi)關(guān)系,我們直接看代碼:


        if (len >= 2) {  // 第一個(gè)數(shù)組的長(zhǎng)度  var len1 = arr[0].length;  // 第二個(gè)數(shù)組的長(zhǎng)度  var len2 = arr[1].length;  // 2個(gè)數(shù)組產(chǎn)生的組合數(shù)  var lenBoth = len1 * len2;  //  申明一個(gè)新數(shù)組,做數(shù)據(jù)暫存  var items = new Array(lenBoth);  // 申明新數(shù)組的索引  var index = 0;  // 2層嵌套循環(huán),將組合放到新數(shù)組中  for (var i = 0; i < len1; i++) {    for (var j = 0; j < len2; j++) {      items[index] = arr[0][i] + arr[1][j];      index++;    }  }}


        吶,這里我們先獲取第一個(gè)和第二個(gè)數(shù)組的長(zhǎng)度,然后計(jì)算出它們有多少種組合方式,然后新建一個(gè)暫存的數(shù)組,用來(lái)存我們組合得到的結(jié)果,后面就是用雙層循環(huán),做字符串連接,放到暫存數(shù)組中,沒(méi)什么好說(shuō)的。


        我們得到了前兩個(gè)的組合結(jié)果,依據(jù)我們的思路,是要把它和原來(lái)數(shù)組合并成一個(gè)新數(shù)組。


        // 第一個(gè)數(shù)組的長(zhǎng)度var len1 = arr[0].length;// 第二個(gè)數(shù)組的長(zhǎng)度var len2 = arr[1].length;// 2個(gè)數(shù)組產(chǎn)生的組合數(shù)var lenBoth = len1 * len2;//  申明一個(gè)新數(shù)組,做數(shù)據(jù)暫存var items = new Array(lenBoth);// 申明新數(shù)組的索引var index = 0;// 2層嵌套循環(huán),將組合放到新數(shù)組中for (var i = 0; i < len1; i++) {  for (var j = 0; j < len2; j++) {    items[index] = arr[0][i] + arr[1][j];    index++;  }}// 將新組合的數(shù)組并到原數(shù)組中var newArr = arr.slice(2)newArr.unshift(items)


        整體的思路就是這樣,得到的新數(shù)組就是剩下的未組合的數(shù)組了,到這里大家應(yīng)該就豁然開(kāi)朗了,然后使用遞歸再次調(diào)用這個(gè)過(guò)程,這樣不斷組合成新數(shù)組,那這個(gè)新數(shù)組當(dāng)參數(shù)時(shí),如果數(shù)組的長(zhǎng)度等于1了,就說(shuō)明組合完了,就會(huì)執(zhí)行后面的 else 語(yǔ)句,輸出出來(lái)。


        整體代碼貼出來(lái)感受一下:

        function doExchange(arr) {  var len = arr.length;  // 當(dāng)數(shù)組大于等于2個(gè)的時(shí)候  if (len >= 2) {    // 第一個(gè)數(shù)組的長(zhǎng)度    var len1 = arr[0].length;    // 第二個(gè)數(shù)組的長(zhǎng)度    var len2 = arr[1].length;    // 2個(gè)數(shù)組產(chǎn)生的組合數(shù)    var lenBoth = len1 * len2;    //  申明一個(gè)新數(shù)組,做數(shù)據(jù)暫存    var items = new Array(lenBoth);    // 申明新數(shù)組的索引    var index = 0;    // 2層嵌套循環(huán),將組合放到新數(shù)組中    for (var i = 0; i < len1; i++) {      for (var j = 0; j < len2; j++) {        items[index] = arr[0][i] + arr[1][j];        index++;      }    }    // 把已經(jīng)合并過(guò)的數(shù)組刪除掉,將新組合的數(shù)組并到原數(shù)組中    var newArr = arr.slice(2)    newArr.unshift(items)    // 執(zhí)行回調(diào)    return doExchange(newArr);  } else {    return arr[0];  }}


        輸出結(jié)果:

        [  'a1x', 'a1y', 'a1z', 'a2x',  'a2y', 'a2z', 'a3x', 'a3y',  'a3z', 'b1x', 'b1y', 'b1z',  'b2x', 'b2y', 'b2z', 'b3x',  'b3y', 'b3z', 'c1x', 'c1y',  'c1z', 'c2x', 'c2y', 'c2z',  'c3x', 'c3y', 'c3z']


        瀏覽 58
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            骚妇视频欧美一区二区 | 国产熟女久久 | 国产福利一区二区 | 色偷偷噜噜噜亚洲男人 | 韩国毛片三 | 男生穿丝袜被室友c爽了 | 日韩精品人妻中文字幕一二三区 | 一区二区三区不卡在线 | 国产下药迷倒白嫩丰满美女j9 | 久久天天弄 |