在Javascript中组合两个或多个数组

时间:2015-07-29 23:13:09

标签: javascript jquery arrays multidimensional-array nested

我目前有一个未知长度的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)功能,但我无法找到它。

有没有人遇到过这样的挑战?如果是这样,你是怎么做到的?

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

我利用了你可以成对组合子数组的事实。对我来说似乎更直接。

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/

答案 2 :(得分:0)

这有效..

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)