我有一个关联数组,我需要获得第一维的所有可能组合。
我的数组看起来像这样:
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]]);
我已经尝试过笛卡尔积的几个函数,但没有人工作
答案 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;
}