JS如何组合数组

时间:2018-01-31 16:20:02

标签: javascript arrays underscore.js

如何从像这样的数组“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);

1 个答案:

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