现在有一批手机,其中颜色有['白色','黑色','金色','粉红色'];内存大小有['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

js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合...相关推荐

  1. [ActionScript 3.0] 对数组中的元素进行排序Array.sort()的方法

    对数组中的元素进行排序. 此方法按 Unicode 值排序. (ASCII 是 Unicode 的一个子集.) 默认情况下,Array.sort()按以下方式进行排序: 1. 排序区分大小写(Z优先于 ...

  2. js 卡片交换动画,网格卡片交换动画,排序算法动画,三消游戏交换动画

    平铺卡片交换动画: 网格卡片交换动画: 排序算法动画: 代码: <!DOCTYPE html> <html lang="en"><head>&l ...

  3. 合并两个无序数组java_Java实现十大排序算法(上)

    概念 概念解释稳定如果a原本在b前面,而a=b,排序之后a仍然在b的前面.不稳定如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面.时间复杂度对排序数据的总的操作次数,反映当n变化 ...

  4. 数组10— sort() : 对数组中的元素进行排序

    在上节,我们学习了如何使用 JavaScript Array some() 方法来检查数组中的至少一个元素是否通过了测试,错过的小伙伴可以点击文章<[JavaScript 教程]第六章 数组09 ...

  5. Shell脚本:数组(穿插四种排序算法)

    目 录 一.认识Shell数组 ①数组的定义方法 ②获取数组长度 ③获取数据列表 ④读取某下表赋值 ⑤数组遍历 ⑥数组切片 ⑦数组替换 ⑦数组删除 ⑧数组追加元素 函数与数组 ①从函数返回数组 ②数组 ...

  6. 数组的常用五种排序算法

    目录 一.排序算法介绍 二.算法代码实现 1.选择法排序 2.冒泡法排序 3.交换法排序 4.插入法排序 5.折半法排序 一.排序算法介绍 1.选择法排序 选择法排序在排序过程中一共需要进行 n(n- ...

  7. 数组专题讲义之简单排序算法

    专题二 简单排序算法 阅读代码,回答下列问题: #include <iostream> using namespace std;const int M = 100; const int N ...

  8. HTML怎么去除数组的重复元素,js去除数组中重复元素并排序

    /p> "http://www.w3.org/TR/html4/strict.dtd"> 003_obj //去掉数组中重复的元素 var arr=[1,2,2,3,3 ...

  9. python如何遍历二维数组的列元素_for循环获取二维数组的元素时的bug

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 问题如下: 最后一行代码current_label = featVec[-1]的index越界. 我在文件3的for循环外,先输出了data_set1 在 ...

  10. js json数组按某一字段排序

    一.首先给大家介绍js中内置的 sort() 方法 此方法默认是按字母顺序对数组中的元素进行排序的,说得更精确点,是按照字符编码的顺序进行排序. 看如下例子: 当数组中元素为 数字类型 时,排序结果与 ...

最新文章

  1. Grid SearchCV(网格搜索) 用法代码演示
  2. 带有控制按钮的图片滚动
  3. word打开老是配置进度_小白教程 | office出现配置进度框,怎么办?
  4. 线程池参数到底要怎么配?
  5. 字典添加数据_【Python基础学习】4. 数据类型之字典及其操作
  6. Android系统的开机画面显示过程分析(12)
  7. 【iCore3 双核心板】例程三十六:DAC实验——输出直流电压
  8. idea 设置author 设置黑色主题
  9. linux---操作命令/文件与目录的权限/软连接/
  10. 3.#技术|Android抓包的原理分析和实际操作,fiddler+Xposed+TrustMe++
  11. MacBook Air开启CPU虚拟化支持(Windows10)
  12. Photoshop —— 白色(或任意颜色)或黑色物体修改成任意色彩
  13. wireshark分析PS流格式解析详解
  14. CVPR2022点云语义分割:Stratified Transformer for 3D Point Cloud Segmentation
  15. linux c 清屏功能实现
  16. 分图层加载CAD数据
  17. 盘点拿些出身最奇特的程序员是什么样的?
  18. 面对物联网安全隐患高墙,熵核科技如何实现突围
  19. 运维人员福利,空气源热泵实现远程智能控制
  20. IT运维面试问题总结-Linux基础

热门文章

  1. Windows操作系统的缘由
  2. 最优化知识笔记整理汇总
  3. word2vec的应用场景
  4. PyTorch:卷积/padding/pooling api
  5. python实现列表的排列和组合
  6. Android的jsoup方法,在Android中使用Jsoup
  7. python如何用pip升级_手把手教你怎么用Python pip怎么升级pip?,专家详解
  8. 计算机网络每日一题,【计算机考研】每日一题-数网操-35
  9. Flutter功能 中ListView和GridView嵌套报错?【教你一步搞定】
  10. 【安装包】Dev-cpp