2Darray中阵列的笛卡尔积

时间:2017-09-28 07:51:21

标签: javascript arrays

我正在尝试在2D阵列的子阵列之间制作笛卡尔积。 我的2dArray是这样的:var matrix = [[1,2,3], [4,5], [6,7,8],[9,10,11]];,但它可以有可变数量的数组。

我使用的功能是:

function cartesianProductOf() {
  return Array.prototype.reduce.call(arguments, function(a, b) {
    var ret = [];
    a.forEach(function(a) {
      b.forEach(function(b) {
        ret.push(a.concat([b]));
      });
    });
    return ret;
  }, [[]]);
}

我尝试使用像cartesianProductOf(matrix)这样的函数,但这不会返回任何结果。

我的问题是如何将子数组作为此函数的参数?如何在子数组中拆分2d数组或如何修改函数以适用于我的情况?

有谁知道如何解决这个问题?

更新 http://jsfiddle.net/XHEJt/10/

var matrix = [[1,2,3], [4,5], [6,7,8],[9,10,11]];

console.log(cartesianProductOf([1,2,3], [4,5], [6,7,8],[9,10,11]));


//the following line does not produce the same output

console.log(cartesianProductOf(matrix));


function cartesianProductOf() {
  return Array.prototype.reduce.call(arguments, function(a, b) {
    var ret = [];
    a.forEach(function(a) {
      b.forEach(function(b) {
        ret.push(a.concat([b]));
      });
    });
    return ret;
  }, [[]]);
}

1 个答案:

答案 0 :(得分:0)

当你询问带参数的函数调用(有效)和数组(不起作用)时,如果arguments.length等于1,你可以插入一个检查,然后取第一个arguments的元素作为减少的值。

return Array.prototype.reduce.call(arguments.length === 1
    ? arguments[0]
    : arguments, function(a, b) {
        // ...