[Javascript]获取所有阵列组合(笛卡尔积)

时间:2015-12-04 15:54:16

标签: javascript arrays

我有一个关联数组,我需要获得第一维的所有可能组合。

我的数组看起来像这样:

var array = [
First:[[1,2,5,15,20], [3,4,6], [7,8]],
Second:[[2,4,6], [1,31,7]],
Third:[[1,2,6], [3,1,23,7,4], [5,8,9], [10,12,17]];

输出应该是那样的

array([[1,2,5,15,20],[2,4,6],[1,2,6]],
[[1,2,5,15,20],[2,4,6],[3,1,23,7,4]],
[[1,2,5,15,20],[2,4,6],[5,8,9],
[[1,2,5,15,20],[2,4,6],[10,12,17]],
[[1,2,5,15,20],[1,31,7],[1,2,6]],
...
[[7,8],[1,31,7],[10,12,17]]);

我已经尝试过笛卡尔积的几个函数,但没有人工作

2 个答案:

答案 0 :(得分:1)

首先,您将对象转换为数组。没有指定对象中属性的顺序,并且如果循环遍历它们,不同的浏览器实际上会以不同的顺序返回它们。如果您总是有三个属性,那很简单:

var arr = [ obj.First, obj.Second, obj.Third ];

然后您可以从数组中创建产品,例如使用递归函数:

function getAll(arr, index) {
  var result = [];
  if (index == arr.length - 1) {
    for (var i = 0; i < arr[index].length; i++) {
      result.push([ arr[index][i] ]);
    }
  } else {
    var next = getAll(arr, index + 1);
    for (var i = 0; i < arr[index].length; i++) {
      for (var j = 0; j < next.length; j++) {
        result.push([ arr[index][i] ].concat(next[j]));
      }
    }
  }
  return result;
}

var obj = {
  First: [[1,2,5,15,20], [3,4,6], [7,8]],
  Second: [[2,4,6], [1,31,7]],
  Third: [[1,2,6], [3,1,23,7,4], [5,8,9], [10,12,17]]
};

var arr = [ obj.First, obj.Second, obj.Third ];

var result = getAll(arr, 0);

// Show result in snippet
document.write(JSON.stringify(result));

答案 1 :(得分:0)

如果你的array中只有3行,那么你可以通过3 for for循环来实现这一行;

function arrayManupulation(arr){
  // the arr must have three sub arrays
  var myarr = [];

    for (var i = 0; i < arr[0].length; i++)     
        for (var j = 0; j < arr[1].length; j++)         
            for (var k = 0; k < arr[2].length; k++)
                myarr.push([arr[0][i], arr[1][j], arr[0][k]]);

    console.log(myarr);
    return myarr;
}