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



我目前有一个未知长度的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)函数已经在那里,但我找不到它。

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

简单递归:

    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/

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

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/

这行得通…

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)

相关内容

  • 没有找到相关文章