求從n個數組任意選取一個元素的全部組合

 最近作項目碰到這個問題,如題從n個數組任意選取一個元素的全部組合。好比已知數組是[1, 3]; [2, 4]; [5]; 最後組合結果是[1, 2, 5]; [1, 4, 5];  [3, 2, 5]; [3, 4, 5];  網上看了好多帖子,發現寫的太複雜,因而本身動手解決。數組

直接貼解決方案:函數

方法一:
 // 執行組合排列的函數
    function doExchange(arr){
        var len = arr.length;
        // 當數組大於等於2個的時候
        if(len >= 2){
            var len1 = arr[0].length;// 第一個數組的長度
            var len2 = arr[1].length; // 第二個數組的長度
            var lenBoth = len1 * len2;// 2個數組產生的組合數
            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']];
    console.log(doExchange(array));
 
方法二:
  garr = [
        ['a', 'b'],
        ['1', '2', '3'],
        ['x', 'y', 'z'],
    ]

    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('|'))
            }
        }
    }
    test(garr);
    function test(arr){
        results = [];
        result = [];
        doExchange(arr, 0);
        console.log( results.join(","));
    }
 
固然還有更多解決辦法,就總結到這兒吧~
相關文章
相關標籤/搜索