Пытаясь получить все возможные комбинации, используя JavaScript - PullRequest
3 голосов
/ 21 февраля 2012

Я в данный момент застрял в этой проблеме,

предположим, что существует массив arr4 (длина не фиксирована).Мне нужно найти все комбинации его элемента.

Ожидаемый результат:

4-16D-5d 
4-16D-5e
4A-16D-5d
4A-16D-5e
4B-16D-5d
4B-16D-5e

4-15D-5d
4-15D-5e
4A-15D-5d
4A-15D-5e
4B-15D-5d
4B-15D-5e

Что я пробовал:

arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']]; //may contains more elements
alert("arr4 "+arr4);
for(var k=0;k<arr4.length;k++){
    alert("k "+k);
    arr_v=arr4[k]
    alert("arrv"+arr_v);
    alert ("arrv lengt"+arr_v.length);
    for(var z=0;z<arr_v.length;z++){
        m=1;
        while(m<arr4.length){
            var test=arr4[m];
            for(var n=0;n<test.length;n++)
                alert(arr_v[z]+"<TEST>"+test[n]);
        }
        m++;
    }
}   

Я вроде нашел решение:

function product() {
    return Array.prototype.reduce.call(arguments, function(as, bs) {
        return [a.concat(b) for each (a in as) for each (b in bs)]
    }, [[]]);
}

НО

arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']];
alert(product(['4','4A','4B'],['16D','15D'],['5d','5e']);

Выше работает, но не работает следующее:

arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']];
alert(product(arr4);

Кто-нибудь, пожалуйста, предложите решение

редактировать: решение здесь

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Вы можете вычислить декартово произведение каждого подмассива.См. этот вопрос и ответ на него

Я опробовал его, и поскольку он выходит за пределы длины каждого массива, он должен работать независимо от того, сколько элементов в каждом списке и возвращает вамсписок каждого товара.

2 голосов
/ 22 февраля 2012
var arr4 = [['4','4A','4B'],['16D','15D'],['5d','5e']];
for(var a = 0; a < arr4[1].length; a++){
    if(a != 0){
        document.write('<br /><br />');
    }
    for(var b = 0; b < arr4[0].length; b++){
        for(var c = 0; c < arr4[2].length; c++){
            document.write(arr4[0][b] + '-' + arr4[1][a] + '-' + arr4[2][c] + '<br />')
        }
    }
}

Очевидно, что вы не хотите использовать document.write, но в последнем цикле for все выходные строки будут использовать

arr4[0][b] + '-' + arr4[1][a] + '-' + arr4[2][b]

jsFiddle для заинтересованных http://jsfiddle.net/5AmMU/1/

...