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