命题场景:
现在有一批手机, 其中颜色有['白色','黑色','金色']; 内存大小有['16G','32G','64G'], 版本有['移动','联通','电信'], 要求写一个算法, 实现[['白色','16G','移动'], ['白色','16G','联通'] ...]这样的组合, 扩张, 如果后面还有参数, 比如再加一个['国行','港版'], 不改程序一样可以执行!
javascript 代码
- // 执行组合排列的函数
- function doExchange(arr){
- 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);
- */
- /********************** 优化后的 ******************************/
- // 将新组合的数组并到原数组中
- arr.splice(0,2,items);
- // 执行回调
- return doExchange(arr);
- }else{
- return arr[0];
- }
- }
- // 执行
- var arr = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']];
- var arr1 = [['a','b','c']];
- //doExchange(arr);
- console.log(doExchange(arr));
来源: http://www.qdfuns.com/article/15931/4f7935b79b54bc1b0d24006f49247a7e.html