現在有一批手機,其中顏色有['白色','黑色','金色','粉紅色'];內存大小有['16G','32G','64G','128G'],版本有['移動','聯通','電信'],要求寫一個算法,實現[['白色','16G','移動'], ['白色','16G','聯通'] ...]這樣的組合,一個數組里面包含若干個數組,進行組合
寫法1:
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)
寫法2:
// 執行組合排列的函數 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));