最近做项目碰到这个问题,如题从n个数组任意选取一个元素的所有组合。比如已知数组是[1, 3]; [2, 4]; [5]; 最后组合结果是[1, 2, 5]; [1, 4, 5]; [3, 2, 5]; [3, 4, 5]; 网上看了好多帖子,发现写的太复杂,于是自己动手解决。
直接贴解决方案:
方法一:
// 执行组合排列的函数
function doExchange(arr){
var len = arr.length;
// 当数组大于等于2个的时候
if(len >= 2){
var len1 = arr[0].length;// 第一个数组的长度
var len2 = arr[1].length; // 第二个数组的长度
var lenBoth = len1 * len2;// 2个数组产生的组合数
var items = new Array(lenBoth); // 申明一个新数组,做数据暂存
var index = 0; // 申明新数组的索引
// 2层嵌套循环,将组合放到新数组中
for(var i=0; i<len1; i++){
for(var j=0; j<len2; j++){
items[index] = arr[0][i] +","+ arr[1][j];
index++;
}
}
// 将新组合的数组并到原数组中
var newArr = new Array(len -1);
for(var i=2;i<arr.length;i++){
newArr[i-1] = arr[i];
}
newArr[0] = items;
// 执行回调
return doExchange(newArr);
}else{
return arr[0];
}
}
//执行
var array = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']];
console.log(doExchange(array));
方法二:
garr = [
['a', 'b'],
['1', '2', '3'],
['x', 'y', 'z'],
]
function doExchange(arr, depth){
for (var i = 0; i < arr[depth].length; i++) {
result[depth] = arr[depth][i];
if (depth != arr.length - 1) {
doExchange(arr, depth + 1)
} else {
results.push(result.join('|'))
}
}
}
test(garr);
function test(arr){
results = [];
result = [];
doExchange(arr, 0);
console.log( results.join(","));
}
['a', 'b'],
['1', '2', '3'],
['x', 'y', 'z'],
]
function doExchange(arr, depth){
for (var i = 0; i < arr[depth].length; i++) {
result[depth] = arr[depth][i];
if (depth != arr.length - 1) {
doExchange(arr, depth + 1)
} else {
results.push(result.join('|'))
}
}
}
test(garr);
function test(arr){
results = [];
result = [];
doExchange(arr, 0);
console.log( results.join(","));
}
当然还有更多解决办法,就总结到这儿吧~