3

Javascriptにいくつかのオプションのセットがあるとしましょう

var color  =  ["red", "blue", "green","yellow"];
var size   =  ["small", "medium", "large"];
var weight =  ["heavy", "light"];

このような配列でこれらのオプションのすべての組み合わせを取得するための効率的なアルゴリズムは何ですか

["red and small and heavy", "red and small and light", "red and medium and heavy" ...]

ただし、ここに注意点があります

この関数は、任意の数のオプションのセットを取得できる必要があります

これを行う適切な方法は、ある種のツリートラバーサルを使用することだと感じていますが、これを完全に検討するには時期尚早であり、まだコーヒーを飲んでいません。

4

4 に答える 4

7
function permutations(choices, callback, prefix) {
    if(!choices.length) {
        return callback(prefix);
    }
    for(var c = 0; c < choices[0].length; c++) {
        permutations(choices.slice(1), callback, (prefix || []).concat(choices[0][c]));
    }
}

var color  =  ["red", "blue", "green","yellow"];
var size   =  ["small", "medium", "large"];
var weight =  ["heavy", "light"];

permutations([color, size, weight], console.log.bind(console));

動作するようです...

[ 'red', 'small', 'heavy' ]
[ 'red', 'small', 'light' ]
[ 'red', 'medium', 'heavy' ]
[ 'red', 'medium', 'light' ]
[ 'red', 'large', 'heavy' ]
[ 'red', 'large', 'light' ]
[ 'blue', 'small', 'heavy' ]
[ 'blue', 'small', 'light' ]
[ 'blue', 'medium', 'heavy' ]
[ 'blue', 'medium', 'light' ]
[ 'blue', 'large', 'heavy' ]
[ 'blue', 'large', 'light' ]
[ 'green', 'small', 'heavy' ]
[ 'green', 'small', 'light' ]
[ 'green', 'medium', 'heavy' ]
[ 'green', 'medium', 'light' ]
[ 'green', 'large', 'heavy' ]
[ 'green', 'large', 'light' ]
[ 'yellow', 'small', 'heavy' ]
[ 'yellow', 'small', 'light' ]
[ 'yellow', 'medium', 'heavy' ]
[ 'yellow', 'medium', 'light' ]
[ 'yellow', 'large', 'heavy' ]
[ 'yellow', 'large', 'light' ]
于 2012-01-11T16:40:45.223 に答える
3

それはこれらのセットのデカルト積になります: http://en.wikipedia.org/wiki/Cartesian_product

参照: https://stackoverflow.com/questions/4796678/javascript-golf-cartesian-product

于 2012-01-11T16:35:50.440 に答える
1

ツリートラバーサルは行くべき道であり、正確には再帰です。

動作原理は、各深さで、その深さのすべてのオプション (この場合はリストのオプション) を反復処理することです。最後の深さから要素を選択すると、完全なセットが 1 つあります。

于 2012-01-11T16:37:12.030 に答える
0

上記の #1 で述べた console.log 関数は次のようになります。

function log(message){
    if(typeof console == "object"){
        console.log(message);
    }
}

次に、関数の呼び出しを次のように変更します。

combinations([color, size, weight], log);
于 2012-10-07T03:07:00.200 に答える