现在有一批手机,其中颜色有['白色','黑色','金色','粉红色'];内存大小有['16G','32G','64G','128G'],版本有['移动','联通','电信'],要求写一个算法,实现[['白色','16G','移动'], ['白色','16G','联通'] ...]这样的组合,扩张,如果后面还有参数,比如再加一个['国行','港版','美版'],不改程序一样可以执行!
通过上面规律可以发现这个算法就是:一个数组里面包含若干个数组,进行组合
算法代码写法一:
// 执行组合排列的函数
function doExchange(array){
var len = arr.length;
// 当数组大于等于2个的时候
if(len >= 2){
// 第一个数组的长度
var len1 = arr[0].length;
// 第二个数组的长度
var len2 = arr[1].length;
// 2个数组产生的组合数
var lenBoth = len1 * len2;
// 申明一个新数组,做数据暂存
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']];
var arr1 = [['a','b','c']]; console.log(doExchange(array));
写法二:
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('|'))
}
}
} function test(arr)
{
results = [];
result = [];
doExchange(arr, 0);
console.log(results.length, results.join(','));
}
garr = [
['a', 'b', 'c'],
['1', '2', '3'],
['x', 'y', 'z'],
]
test(garr)
可能也会有类似的需求,但是我们今天要讲的不是这样的需求,而是里面的每一个组合要是一个数组:
/*返回组合的数组*/
function doExchange(array){
var len = arr.length;
// 当数组大于等于2个的时候
if(len >= 2){
// 第一个数组的长度
var len1 = arr[0].length;
// 第二个数组的长度
var len2 = arr[1].length;
// 2个数组产生的组合数
var lenBoth = len1 * len2;
// 申明一个新数组
var items = new Array(lenBoth);
// 申明新数组的索引
var index = 0;
for(var i=0; i<len1; i++){
for(var j=0; j<len2; j++){
if(arr[0][i] instanceof Array){
items[index] = arr[0][i].concat(arr[1][j]);
}else{
items[index] = [arr[0][i]].concat(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 arr = [['a', 'b', 'c','d'], [1, 2, 3,4], ['x', 'y', 'z'],['魅族手机']];
console.log(doExchange(arr));