2015-11-04 61 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

相关问题