将数组变量传递给一个函数,该函数生成具有y个变量的x个数组的所有组合

时间:2015-11-04 14:16:11

标签: javascript multidimensional-array combinations

我正在使用@Bergi发布的这个。它完美地完成任务。但我想传入一个数组变量,那就是它不起作用。所以而不是:

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]);

我真的想用一个对象数组来做这个,我也试过了,并得到了相同的结果,它只是返回原来的三个数组。我需要这样做,因为我将传递任意数量的任何长度数组。

1 个答案:

答案 0 :(得分: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);