js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合
现在有一批手机,其中颜色有['白色','黑色','金色','粉红色'];内存大小有['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));
转自:https://www.cnblogs.com/linJie1930906722/p/6854517.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2018-12-05 Android 获取keystore SHA1方法