【问题标题】:Combining two or more arrays in Javascript在Javascript中组合两个或多个数组
【发布时间】:2015-10-21 03:46:54
【问题描述】:

我目前有一个未知长度的 Javascript 数组,其中包含字符串数组(长度未知)。我正在寻找一种方法来找到每个可能的组合,使用每个二级数组中的一个字符串。注意:字符串的顺序无关紧要。也就是说,对于:

[
    [
        'a',
        'b'
    ],
    [
        'c',
        'd'
    ]
]

我想退货:

[
    'ac',
    'ad',
    'bc',
    'bd'
]

或者,给定:

[
    [
        'a',
        'b'
    ],
    [
        '1'
    ],
    [
        'i',
        'j',
        'k',
    ]
]

我想退货:

[
    'a1i',
    'a1j',
    'a1k',
    'b1i',
    'b1j',
    'b1k',
]

我觉得答案在于递归函数,但我似乎无法让它工作(变量范围越来越混乱,它只是平淡无奇)。

相反,我尝试了另一种创建结果数组的方法,循环遍历每个子数组并将每个字符串放在结果中,以便创建每个可能的组合:

function getArrayStrings(allTerms){

    // get total number of possible combinations
    var numberOfElements = 1;

    $.each(allTerms, function(index, element){
        numberOfElements *= element.length;
    });


    // create array of results
    var result = [];

    for(i = 0; i < numberOfElements; i ++){
        result[i] = '';
    }

    // instantiate variables that will be used in loop
    var elementToUse = 0;
    var currentLength = 1;
    var prevLength = 1;

    // for each array, loop through values and add them to the relevant result element
    $.each(allTerms, function(index, array){    

        // find length of current array
        currentLength = array.length;
        elementToUse = 0;

        // for each of the elements in the results array
        for(i = 0; i < numberOfElements; i ++){

            // change the element to use if you've looped through the previous length (but not if it's first result
            if(i !== 0 && i % prevLength === 0){
                elementToUse ++;
            }

            // return to using the first element if you've reached the last element in the sub array
            if(elementToUse % currentLength === 0){
                elementToUse = 0;
            }

            result[i] += '.' + array[elementToUse];

        }

        prevLength = array.length * prevLength;

    });

    console.log(result.join(''));

    return result.join('');

}

这确实有效,但是我想知道是否有人知道更简单的功能;我觉得这是一个已经有一些 Javascript(或 jQuery)函数的东西,但我找不到它。

以前有人遇到过这样的挑战吗?如果是这样,您是如何处理的?

【问题讨论】:

    标签: javascript jquery arrays multidimensional-array nested


    【解决方案1】:

    简单递归:

        var a = [ [ 'a', 'b' ],
                  [ '1' ],
                  [ 'i', 'j', 'k' ]
        ];
    
        function combo( arr, i, j ) {
            if (i===j-1) return arr[i];   
            var res = [];
            arr[i].forEach( function(a) {
                combo( arr, i+1, j ).forEach( function(b) {
                    res.push(a+b);
                });
            });
            return res;
        }
    
        console.log( combo(a, 0, a.length) );
    

    http://jsfiddle.net/zpg04kso/1/

    【讨论】:

    • 三个很好的答案。选择这个是因为它向我展示了如何使用递归来实现 - 对如何做到这一点很感兴趣。
    【解决方案2】:

    这行得通..

    var a = [['a','b'], ['1'],['i','j','k']],
            b = [];
    
    
    function cat(a1,a2){
        var a = []
                l = undefined;
    
        while (a2.length > 0){
            l = a2.shift();
            a1.forEach(function(ele,idx,arr){
                a.push(ele + l)
            })
        }
        return a;
    }
    
    function merge(arr){
        if (arr.length == 1){
            return arr.shift()
        } else {
            var a1 = arr.shift()
            return cat(a1,merge(arr))
        }
    }
    
    
    var b = merge(a);
    console.log(b)
    

    【讨论】:

      【解决方案3】:

      我利用了您可以成对组合子数组这一事实。对我来说,这似乎更直接一些。

      var input = [
          ['a','b'],
          ['1', '2','3','4'],
          ['i','j','k']
      ];
      
      function getArrayStrings(input) {    
          function combine(arr1, arr2) {
              var output = [];
              for (var i=0;i<arr1.length;i++) {
                  for(var j=0;j<arr2.length;j++) {
                       output.push(arr1[i] + arr2[j]);
                  }
              }
              return output;
          }
      
          var output = [];
          for(var i=0;i<input.length;i++) {
              if (i==0) output = input[i];
              else output = combine(output, input[i]);
          }
      
          return output;
      }
      
      var output = getArrayStrings(input);
      console.log(output);
      

      http://jsfiddle.net/blaird/kcytLv1r/

      【讨论】:

      • 感谢您的回答。伟大的想法,非常感谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      相关资源
      最近更新 更多