JS如何组合数组

JS how to combinate array

我如何从这样的数组中获得变体的完整组合?"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);

您的迭代方法可以按如下方式完成:

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

您也可以为此使用递归函数。在每个递归级别,您 select 来自相应子数组的值,将其添加到部分结果中。在递归的最深层次上,这将是一个完整的结果,可以将其添加到包含所有结果的数组中:

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