0

たとえば、次の配列があります。

a1 = ["1", "2", "3"];
a2 = ["a", "b"];
a3 = ["q", "w", "e"];

result = ["1aq", "1aw", "1ae", "1bq", "1bw", ... "3be"];

ネストされたループなしでこれを取得するにはどうすればよいでしょうか (たとえば、jquery も使用します)。ありがとう

4

5 に答える 5

4

ネストされたループの何が問題なのかわかりませんが、一般的な解決策は次のとおりです。

var a = [a1, a2, a3];

var result = [""]; // start with the empty string,
for (var i=0; i<a.length; i++) { // and repeatedly
        var ai = a[i],
            l = ai.length;
    result = $.map(result, function(r) { // make result a new array of
        var ns = []; // new combinations of
        for (var j=0; j<l; j++) // each of the letters in ai
            ns[j] = r + ai[j]; // and the old results
        return ns;
    }); // using the odds of jQuery.map with returned arrays
}
return result;
于 2013-02-02T15:23:15.200 に答える
2

ネストされたループはありません。必要な数の配列を処理できます。

var result = combine(a1, a2, a3);

function combine() {
    return processArrays([].slice.call(arguments), "", []);

    function processArrays(arrays, str, res) {
        for (var i = 0; i < arrays[0].length; i++) {
            if (arrays.length > 1) {
                processArrays(arrays.slice(1), str + arrays[0][i], res);
            } else {
                res.push(str + arrays[0][i]);
            }
        }
        return res;
    }
}

または、関数のわずかに異なる見方:

function combine() {
    return processArrays([].slice.call(arguments), "", []);

    function processArrays(arrays, str, res) {
        if (arrays.length === 0)
            res.push(str)
        else
            for (var i = 0; i < arrays[0].length; i++)
                processArrays(arrays.slice(1), str + arrays[0][i], res);
        return res;
    }
}

そして、これはループなしのバージョンです:

var result = combine(a1, a2, a3);

function combine() {
    return processArrays(arguments[0], [].slice.call(arguments, 1), "", []);

    function processArrays(head, tail, str, res) {
        if (head === undefined)
            res.push(str)
        else
            processArray(head[0], head.slice(1), tail, str, res);
        return res;
    }
    function processArray(head, tail, arrays, str, res) {
        if (head) {
            processArrays(arrays[0], arrays.slice(1), str + head, res);
            processArray(tail[0], tail.slice(1), arrays, str, res)
        }
    }
}
于 2013-02-02T17:17:59.867 に答える
1

一般的な再帰的ソリューション:

function combine() {
    var target = arguments[0];

    if (arguments.length === 1) {
        return target; // end of chain, just return the array
    }

    var result = [];
    // compute all combinations without the first array
    var combinations = combine.apply(null, Array.prototype.slice.call(arguments, 1));

    // put things together
    for (var i = 0, l = target.length; i < l; i++) {
        var element = target[i];
        for (var j = 0, lj = combinations.length; j < lj; j++) {
            result.push(element + combinations[j]);
        }
    }
    return result;
}

// Usage
var result = combine(a1, a2, a3);
于 2013-02-02T15:24:32.307 に答える
0

別の一般的なソリューション。

var reduce = function(a, b) {
    var r = [];
    $.each(a, function(i, ai) {
        $.each(b, function(j, bj) {
            r.push(ai + bj);
        });
    });
    return r;
};

var result = reduce(reduce(a1, a2), a3);
于 2013-02-02T15:33:11.217 に答える
-1
var outputArray = [];
for(var i = 0, finalLength = a1.length * a2.length * a3.length; i < finalLength; i++) {
   outputArray[i] = a1[i % a1.length].toString() + a2[i % a2.length].toString() + a3[i % a3.length].toString(); 
}

しかし、これは本当に単なるスタントです。なぜループを避けるのですか?私は推測することができます:あなたはあなたが持っているアレイの数を前もって知りません。しかし、それはまだ挑戦になるでしょう。

于 2013-02-02T15:08:27.530 に答える