簡體   English   中英

Javascript樹遍歷算法

[英]Javascript Tree Traversal Algorithm

我需要以深度優先的方式遍歷樹結構的幫助。 我無法想出一個算法來正確地做到這一點。

我的意見是這樣的:

[
    ["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"
]

這應該做的工作:

 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); 

您正在尋找的是列表清單中的笛卡爾積,之前已經被過。 借用該問題的已接受答案,您可以在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"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM