2012-03-19 3 views
6

深みのある方法でツリー構造を横断する助けが必要です。私はそれを正しく行うためのアルゴリズムを考え出すことができません。Javascriptツリートラバーサルアルゴリズム

私の入力はこれです:出力形式をとるべき

[ 
    ["A", "B", "C"], 
    ["1", "2"], 
    ["a", "b", "c", "d"] 
] 

[ 
    "A/1/a", "A/1/b", "A/1/c", "A/1/d", 
    "A/2/a", "A/2/b", "A/2/c", "A/2/d", 
    "B/1/a", "B/1/b", "B/1/c", "B/1/d", 
    "B/2/a", "B/2/b", "B/2/c", "B/2/d", 
    "C/1/a", "C/1/b", "C/1/c", "C/1/d", 
    "C/2/a", "C/2/b", "C/2/c", "C/2/d" 
] 
+0

これを行うことができますが、それはですビットトリッキー。データを再編成する方法はありますか? 「A B C」のどれが「1 2」に対応し、「A B C」は「a b c d」に対応するのかを調整するのに問題が生じるでしょう。あなたの期待されるデータは、それがかなり奇妙なルールに従っているように見えます。しかし、予想されるデータを与えるために+1。 – Bojangles

+0

どのような方法でも入力を操作できます。どのような形が望ましいでしょうか? – Adam

+0

私が考えることができる最も簡単な方法は、兄弟配列の代わりに子配列を持つことです。これは、木のような構造としてトラバースするほうがはるかに簡単です。 – Bojangles

答えて

7

これは、ジョブを実行する必要があります。

function traverse(arr) { 
 
    var first = arr[0]; 
 
    var ret = []; 
 
    if (arr.length == 1) { 
 
    for (var i = 0; i < first.length; i++) { 
 
     ret.push(first[i]); 
 
    } 
 
    } else { 
 
    for (var i = 0; i < first.length; i++) { 
 
     var inn = traverse(arr.slice(1)); 
 
     for (var j = 0; j < inn.length; j++) { 
 
     ret.push(first[i] + '/' + inn[j]); 
 
     } 
 
    } 
 
    } 
 
    return ret; 
 
} 
 

 
var inp = [ 
 
    ["A", "B", "C"], 
 
    ["1", "2"], 
 
    ["a", "b", "c", "d"] 
 
]; 
 

 
var out = traverse(inp); 
 

 
console.log(out);

3

あなたが探しているものは、リストのリストの直積である、それはaskedてきました前。その質問のための受け入れ答えから借りて、あなたはJavascript 1.7でこれを行うことができます。

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)]; 
    }, [[]]); 
}; 

function convert(lst) { 
    var solution = []; 
    for (var i = 0; i < lst.length; i++) { 
    solution.push(lst[i][0] + "/" + lst[i][1] + "/" + lst[i][2]); 
    } 
    return solution; 
}; 

convert(product(["A", "B", "C"], ["1", "2"], ["a", "b", "c", "d"])); 

> ["A/1/a", "A/1/b", "A/1/c", "A/1/d", 
    "A/2/a", "A/2/b", "A/2/c", "A/2/d", 
    "B/1/a", "B/1/b", "B/1/c", "B/1/d", 
    "B/2/a", "B/2/b", "B/2/c", "B/2/d", 
    "C/1/a", "C/1/b", "C/1/c", "C/1/d", 
    "C/2/a", "C/2/b", "C/2/c", "C/2/d"] 
+0

パーマリンクを含むべきだと思うのですが、理論的には受け入れられた回答を変更して100件の回答を投稿することができます(それを見つけるのはかなり難しくなります)。 – ajax333221

+0

@ ajax333221が合意しました。 –

+1

これはよりエレガントでより一般化されていますが、特定の問題を解決するものではなく、現在のバージョンにエラーがあります。 – Adam

関連する問題