0

次の 2 次元配列入力があります。

 var arr = [ 
        ['A', ['Sun','Moon']],
        ['B', ['Cat','Dog']],
        ['C', ['John','Peter','Zora']]
 ];

その入力を使用して、すべての組み合わせを JavaScript の特定のパターンに適用します。

パターン内のプレースホルダーは次の形式です: $( name )

結果のサンプルパターンを次に示します。

 var pattern1 = "$(A) / $(A)";
 /* Expected Result
    "Sun / Sun"
    "Sun / Moon"
    "Moon / Sun"
    "Moon / Moon"
 */

 var pattern2 = "$(A)--$(B)";
/* Expected Result
    "Sun--Cat"
    "Sun--Dog"
    "Moon--Cat"
    "Moon--Dog"
*/

 var pattern3 = "$(C) + $(B)";
/* Expected Result
    "John + Cat"
    "John + Dog"
    "Peter + Cat"
    "Peter + Dog"
    "Zora + Cat"
    "Zora + Dog"    
*/

  var pattern4 = "$(A) - $(A) * ( $(B) + $(C) )";
/* Expected Result
    "Sun -  Sun * ( Cat + John )"
    "Sun -  Sun * ( Cat + Peter )"
    "Sun -  Sun * ( Cat + Zora )"
    "Sun -  Sun * ( Dog + John )"
    "Sun -  Sun * ( Dog + Peter )"
    "Sun -  Sun * ( Dog + Zora )"
    "Sun -  Moon * ( Cat + John )"
    "Sun -  Moon * ( Cat + Peter )"
    "Sun -  Moon * ( Cat + Zora )"
    "Sun -  Moon * ( Dog + John )"
    "Sun -  Moon * ( Dog + Peter )"
    "Sun -  Moon * ( Dog + Zora )"
    "Moon -  Sun * ( Cat + John )"
    "Moon -  Sun * ( Cat + Peter )"
    "Moon -  Sun * ( Cat + Zora )"
    "Moon -  Sun * ( Dog + John )"
    "Moon -  Sun * ( Dog + Peter )"
    "Moon -  Sun * ( Dog + Zora )"
    "Moon -  Moon * ( Cat + John )"
    "Moon -  Moon * ( Cat + Peter )"
    "Moon -  Moon * ( Cat + Zora )"
    "Moon -  Moon * ( Dog + John )"
    "Moon -  Moon * ( Dog + Peter )"
    "Moon -  Moon * ( Dog + Zora )"
*/

パターンは、任意の組み合わせ (繰り返しのプレースホルダーを使用) および任意の長さにすることができます。

誰かがJavaScriptのアルゴリズムを手伝ってくれますか?

ありがとうございました。

4

2 に答える 2

0

これを行うには、再帰関数を使用できます。

まず、文字列から名前を抽出する必要があります。正規表現でこれを行うことができます:

var regex = /\$\(([A-Z])\)/g,
    names = [], match;

while(match = regex.exec(pattern)) {
    names.push(match[1]);
}

次に、このリストと値のマッピングを、名前を再帰的に繰り返す関数に渡します。

function create_combinations(pattern, names, map, index) {
    index = index || 0;
    var name = names[index],
        values = map[name],
        needle = "$(" + name + ")",
        combinations = [],
        sub;

    if (index === names.length - 1) {
        for (var i = 0, l = values.length; i < l; i++) {
            combinations.push(pattern.replace(needle, values[i]));
        }
    }
    else {
        for (var i = 0, l = values.length; i < l; i++) {
            sub = pattern.replace(needle, values[i]);
            combinations = combinations.concat(create_combinations(sub, names, map, index + 1));
        }
    }
    return combinations;
}

これには、データ構造がオブジェクトである必要があります。

var map = { 
    'A': ['Sun','Moon'],
    'B': ['Cat','Dog'],
    'C': ['John','Peter','Zora']
};

次に、関数を呼び出します

create_combinations(pattern, names, map);

デモ

于 2012-06-25T14:22:48.500 に答える