zoukankan      html  css  js  c++  java
  • 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));
  • 相关阅读:
    recurse_array_change_key_case()递规返回字符串键名全为小写或大写的数组
    php循环创建目录
    ajaxFileUpload增加附加参数
    dedecms5.7 联动类型无法显示
    一些比较隐秘的OJ的网址
    Emacs 配置
    qwq
    233
    [八省联考2018]林克卡特树lct
    [APIO2014]序列分割
  • 原文地址:https://www.cnblogs.com/linJie1930906722/p/6854517.html
Copyright © 2011-2022 走看看