js陣列全排列問題

shineSnow發表於2018-10-26
function doCombination(arr) {
    var count = arr.length - 1; //陣列長度(從0開始)
    var tmp = [];
    var totalArr = [];// 總陣列

    return doCombinationCallback(arr, 0);//從第一個開始
    //js 沒有靜態資料,為了避免和外部資料混淆,需要使用閉包的形式
    function doCombinationCallback(arr, curr_index) {
        for(val of arr[curr_index]) {
            tmp[curr_index] = val;//以curr_index為索引,加入陣列
            //當前迴圈下標小於陣列總長度,則需要繼續呼叫方法
            if(curr_index < count) {
                doCombinationCallback(arr, curr_index + 1);//繼續呼叫
            }else{
                totalArr.push(tmp);//(直接給push進去,push進去的不是值,而是值的地址)
            }

            //js  物件都是 地址引用(引用關係),每次都需要重新初始化,否則 totalArr的資料都會是最後一次的 tmp 資料;
            oldTmp = tmp;
            tmp = [];
            for(index of oldTmp) {
                tmp.push(index);
            }
            }
            return totalArr;
    }
}
//測試陣列
var arr = [
    [1,2,3,4,5],
    ['a','b','c','d'],
    ['成功', '失敗']
];
//呼叫方法
console.log(doCombination(arr));
複製程式碼

參考連結

相關文章