2015-11-04 60 views
1

我使用@Bergi發佈的這個函數。它完美地完成任務。但我想傳入一個數組變量,這是不起作用的時候。因此,而不是:將數組變量傳遞給一個函數,用y變量生成x個數組的所有組合

cartesian([0,1], [0,1,2,3], [0,1,2]); 

此相反:

var array =[[0,1], [0,1,2,3], [0,1,2]]; 
cartesian(array); 
function cartesian() { 
    var r = [], arg = arguments, max = arg.length-1; 
    function helper(arr, i) { 
     for (var j=0, l=arg[i].length; j<l; j++) { 
      var a = arr.slice(0); // clone arr 
      a.push(arg[i][j]); 
      if (i==max) 
       r.push(a); 
      else 
       helper(a, i+1); 
     } 
    } 
    helper([], 0); 
    return r; 
} 
cartesian([0,1], [0,1,2,3], [0,1,2]); 

我真的想與對象的數組來做到這一點,我想,也找來這是它一樣的結果返回了原來的三個數組。我需要這樣做,因爲我將傳遞任何數量的任何長度的數組。

回答

3

你想要.apply(),它接受一個參數數組並將它們傳遞給一個函數。

cartesian.apply(null, array); 

function cartesian() { 
 
    var r = [], 
 
    arg = arguments, 
 
    max = arg.length - 1; 
 

 
    function helper(arr, i) { 
 
    for (var j = 0, l = arg[i].length; j < l; j++) { 
 
     var a = arr.slice(0); // clone arr 
 
     a.push(arg[i][j]); 
 
     if (i == max) 
 
     r.push(a); 
 
     else 
 
     helper(a, i + 1); 
 
    } 
 
    } 
 
    helper([], 0); 
 
    return r; 
 
} 
 

 
var array = [ 
 
    [0, 1], 
 
    [0, 1, 2, 3], 
 
    [0, 1, 2] 
 
]; 
 

 
var r = cartesian.apply(null, array); 
 
console.log(r);

+0

完美。謝謝! – BoomerAndZiggy

相關問題