如何从像这样的数组“myArray”我可以得到完整的变体组合?
var myArray = [
[1],
[1,2,3],
[1,2]
];
即。我想要这样的数组:
var res = [
[1,1,1],
[1,1,2],
[1,2,1],
[1,2,2],
[1,3,1],
[1,3,2]
];
“myArray”的长度可以不同。谢谢你的帮助
var myArray = [
[1],
[1,2,3],
[1,2]
];
var length = myArray.length;
var rowsCount = 1;
myArray.map(function(item){
rowsCount *= item.length;
});
var res = [],i,j;
for(i = 0; i < rowsCount; i++){
// all needed rows 1...6
for(j = 0; j < length; j++){
// walk through arrays 0,1,2
}
res.push([]);
}
console.log(res.length);
答案 0 :(得分:0)
您的迭代方法可以按如下方式完成:
function combinations(arr){
const count = arr.reduce( (sum, a) => sum * a.length, 1 ),
results = [];
for (let i = 0; i < count; i++) {
const acc = [];
for (let j = arr.length, k = i; j--; k = Math.floor(k / arr[j].length)) {
acc[j] = arr[j][k % arr[j].length];
}
results.push(acc);
}
return results;
}
// Sample data
var myArray = [
[1],
[1,2,3],
[1,2]
];
console.log(JSON.stringify(combinations(myArray)));
您也可以使用递归函数。在每个递归级别,您从相应的子阵列中选择一个值,并将其添加到部分结果中。在最深层次的递归中,这将是一个完整的结果,可以添加到具有所有结果的数组中:
function combinations(arr){
var results = [];
(function recurse(acc, i) {
if (i >= arr.length) return results.push(acc);
for (const val of arr[i]) {
recurse(acc.concat(val), i+1);
}
})([], 0);
return results;
}
// Sample data
var myArray = [
[1],
[1,2,3],
[1,2]
];
console.log(JSON.stringify(combinations(myArray)));