最近做项目碰到这个问题,如题从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(","));
    }

 
当然还有更多解决办法,就总结到这儿吧~

求从n个数组任意选取一个元素的所有组合的更多相关文章

  1. [jstips]向数组中插入一个元素

    向现有数组中插入一个元素是经常会见到的一个需求.你可以: 使用push将元素插入到数组的尾部: 使用unshift将元素插入到数组的头部: 使用splice将元素插入到数组的中间: 上面那些方法都是常 ...

  2. C#如何删除数组中的一个元素

    C#如何删除数组中的一个元素,剩余的元素组成新数组,数组名不变double[] arr = new double[n];需要删除的是第m+1个数据arr[m]求新数组arr.(新数组arr包含n-1个 ...

  3. JS---动画函数封装:设置任意的一个元素,移动到指定的目标位置

    动画函数封装:设置任意的一个元素,移动到指定的目标位置 <!DOCTYPE html> <html lang="en"> <head> < ...

  4. JS数组去掉某一个元素

    /**数组去掉某一个元素**/ Array.prototype.remove = function(val) { var index = this.indexOf(val); if (index &g ...

  5. js有序数组中插入一个元素,并有序的输出

    题目:比较传入函数的参数,将参数组成数组,从小到大排序,返回新的数组. 如: insert();console.log(arr); //[] insert(-1,-2); console.log(ar ...

  6. js多种方法取数组的最后一个元素

    一: pop()方法 pop()方法,删除数组最后一个并返回该元素 利用这个方法可以取到数组的最后一个,同理shift()可以取到数组的第一个(shift()删除数组第一个并返回该元素) var ar ...

  7. pop() 删除掉数组的最后一个元素

    下面的代码首先创建了一个拥有四个元素的数组 myFish,然后删除掉它的最后一个元素. let myFish = ["angel", "clown", &quo ...

  8. C语言数组删除增加一个元素

    malloc,realloc,calloc一直很头疼,这次笔试题需要在数组后重新分配新的空间的代码是: //删除函数,删除ptr中的ptr[in]元素,n是数组原来的长度. void rmv(int ...

  9. 剑指offer-特定二维数组中查找一个元素是否存在-二分搜索-二维数组

    int [][] array ={ {1,2,8,9}, {2,4,9,12}, {4,7,10,13}, {6,8,11,19} }; 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都 ...

随机推荐

  1. 多线程之Parallel类

    Parallel类是对线程的一个抽象.该类位于System.Threading.Tasks名称空间中,提供了数据和任务并行性. Paraller类定义了数据并行地For和ForEach的静态方法,以及 ...

  2. 5.Lock接口及其实现ReentrantLock

    jdk1.7.0_79 在java.util.concurrent.locks这个包中定义了和synchronized不一样的锁,重入锁——ReentrantLock,读写锁——ReadWriteLo ...

  3. 日志组件一:Log4j

    log4j是Apache的一个开源项目,陪伴了我们多年,但是现在已经不更新了.官网原文如下: Log4j 1.x has been widely adopted and used in many ap ...

  4. Linux常用网络测试命令

    Linux常用网络测试命令 1. ifconfig     可以使用ifconfig命令来配置并查看网络接口的配置情况.    例如: (1) 配置eth0的IP地址, 同时激活该设备. #ifcon ...

  5. mysql之 mysqldump 备份恢复详解

    mysqldump是MySQL用于转存储数据库的客户端程序.转储包含创建表和/或装载表的SQL语句 ,用来实现轻量级的快速迁移或恢复数据库,是mysql数据库实现逻辑备份的一种方式. mysqldum ...

  6. 使用Generator 自动生成 model mapper mapping 文件

    1.下载包 地址http://download.csdn.net/detail/u012909091/7206091 2.下载完成解压文件到任意目录 3.删除下mybatis-generator-co ...

  7. Android依赖管理与私服搭建

    在Android开发中,一个项目需要依赖许多的库,我们自己写的,第三方的等等,这篇文件介绍的就是自己搭建私服,创建自己的仓库,进行对我们自己写的库依赖管理.本文是在 mac book pro 环境上搭 ...

  8. JavaScript面向对象轻松入门之概述(demo by ES5、ES6、TypeScript)

    写在前面的话 这是一个JavaScript面向对象系列的文章,本篇文章主要讲概述,介绍面向对象,后面计划还会有5篇文章,讲抽象.封装.继承.多态,最后再来一个综合. 说实话,写JavaScript面向 ...

  9. css代码初始化

    @charset "utf-8";/* 页面元素初始化和常用样式定义-start *//*======== 全局 ========*/body, div, dl, dt, dd, ...

  10. ios移动端原生滚动条滚动不灵敏问题

    最近开发微信页面的时候遇到了这个问题, 因为移动端浏览器的原生滚动条样式很好,不像pc端那么难看,所以在页面需要滚动的地方用了原生的滚动条,这种滚动条在安卓浏览器中没有任何问题,但是在ios微信浏览器 ...