2012-03-19 3 views
6

깊이있는 트리 구조를 탐색하는 데 도움이 필요합니다. 내가 제대로 할 수있는 알고리즘을 생각해 낼 수 없다.자바 스크립트 트리 순회 알고리즘

[ 
    ["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 d'인지를 조정하는 데 어려움을 겪을 것입니다. 꽤 이상한 규칙을 따르는 것처럼 예상 데이터가 나타납니다. 하지만 예상 데이터를 제공하기 위해 +1. – Bojangles

+0

예. 어떤 식 으로든 입력을 조작 할 수 있습니다. 어떤 형태가 바람직할까요? – Adam

+0

내가 생각할 수있는 가장 쉬운 방법은 형제 배열 대신 자식 배열을 갖는 것입니다. 이것은 나무와 같은 구조로 트래버스하는 것이 훨씬 쉽습니다. – Bojangles

답변

7

: 그 질문에 대한 허용 대답에서 대출, 당신은 자바 스크립트 1.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

내 입력이있다 전에. 이 작업해야

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

나는 permalink를 포함시켜야한다고 생각합니다. 왜냐하면 그들은 이론적으로 허용 된 대답을 바꿀 수 있고 100 개의 답을 더 게시 할 수 있기 때문입니다. (그리고 꽤 찾아 내기 어려울 것입니다.) – ajax333221

+0

@ ajax333221이 동의했습니다. 나는 당신이 제안한대로 permalink를 추가했습니다. –

+1

더 우아하고 일반화되었지만 특정 문제가 해결되지 않고 현재 버전에 오류가 있습니다. – Adam