js多個(N)個數組的的元素組合排序算法,多維數組的排列組合或多個數組之間的排列組合


現在有一批手機,其中顏色有['白色','黑色','金色','粉紅色'];內存大小有['16G','32G','64G','128G'],版本有['移動','聯通','電信'],要求寫一個算法,實現[['白色','16G','移動'], ['白色','16G','聯通'] ...]這樣的組合,擴張,如果后面還有參數,比如再加一個['國行','港版','美版'],不改程序一樣可以執行!

通過上面規律可以發現這個算法就是:一個數組里面包含若干個數組,進行組合

算法代碼寫法一:

 

// 執行組合排列的函數
    function doExchange(array){
        var len = arr.length;
        // 當數組大於等於2個的時候
        if(len >= 2){
            // 第一個數組的長度
            var len1 = arr[0].length;
            // 第二個數組的長度
            var len2 = arr[1].length;
            // 2個數組產生的組合數
            var lenBoth = len1 * len2;
            //  申明一個新數組,做數據暫存
            var items = new Array(lenBoth);
            // 申明新數組的索引
            var index = 0;
            // 2層嵌套循環,將組合放到新數組中
            for(var i=0; i<len1; i++){
                for(var j=0; j<len2; j++){
                    items[index] = arr[0][i] +"|"+ arr[1][j];
                    index++;
                }
            }
            // 將新組合的數組並到原數組中
            var newArr = new Array(len -1);
            for(var i=2;i<arr.length;i++){
                newArr[i-1] = arr[i];
            }
            newArr[0] = items;
            // 執行回調
            return doExchange(newArr);
        }else{
            return arr[0];
        }
    }

    //執行
    var array = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']];
    var arr1 = [['a','b','c']];

    console.log(doExchange(array));

 

寫法二:

 

function doExchange(arr, depth)
{
    for (var i = 0; i < arr[depth].length; i++) {
        result[depth] = arr[depth][i]
        if (depth != arr.length - 1) {
            doExchange(arr, depth + 1)
        } else {
            results.push(result.join('|'))
        }
    }
}

function test(arr)
{
    results = [];
    result = [];
    doExchange(arr, 0);
    console.log(results.length, results.join(','));
}
garr = [
['a', 'b', 'c'],
['1', '2', '3'],
['x', 'y', 'z'],
]
test(garr)

 

 

 

可能也會有類似的需求,但是我們今天要講的不是這樣的需求,而是里面的每一個組合要是一個數組:

/*返回組合的數組*/
function doExchange(array){ var len = arr.length; // 當數組大於等於2個的時候 if(len >= 2){ // 第一個數組的長度 var len1 = arr[0].length; // 第二個數組的長度 var len2 = arr[1].length; // 2個數組產生的組合數 var lenBoth = len1 * len2; // 申明一個新數組 var items = new Array(lenBoth); // 申明新數組的索引 var index = 0; for(var i=0; i<len1; i++){ for(var j=0; j<len2; j++){ if(arr[0][i] instanceof Array){ items[index] = arr[0][i].concat(arr[1][j]); }else{ items[index] = [arr[0][i]].concat(arr[1][j]); } index++; } } var newArr = new Array(len -1); for(var i=2;i<arr.length;i++){ newArr[i-1] = arr[i]; } newArr[0] = items; return doExchange(newArr); }else{ return arr[0]; } } // var arr = [['a', 'b', 'c','d'], [1, 2, 3,4], ['x', 'y', 'z'],['魅族手機']]; console.log(doExchange(arr));

 


免責聲明!

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



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