sollte der Code unten Aufbau korrekt funktionieren mit jedem Eingang ähnlich wie Ihre Beispiel.
Es wird jedoch davon ausgegangen, dass jeder Knoten mit einem einzelnen Zeichen identifiziert wird. Sie müssten es ändern, um längere Symbole zu unterstützen.
Dieser Code ist auch nicht kugelsicher und bricht ohne Warnung bei ungültigen Eingabezeichenfolgen ab.
Die Hauptidee besteht darin, die Zeichenfolge in umgekehrter Reihenfolge zu analysieren und die Knotenhierarchie mithilfe des Stapels Array zu verfolgen.
var newick = '(A,B,(C,D)E)F',
stack = [],
child,
root = [],
node = root;
newick.split('').reverse().forEach(function(n) {
switch(n) {
case ')':
// ')' => begin child node
stack.push(node);
node = child.children = [];
break;
case '(':
// '(' => end of child node
node = stack.pop();
break;
case ',':
// ',' => separator (ignored)
break;
default:
// assume all other characters are node names
node.push(child = { name: n });
break;
}
});
Und hier ist eine einfache Funktion, die die resultierende Struktur wird Dump:
var dmp;
(dmp = function(node, level) {
node.forEach(function(n) {
console.log(Array(level).join('-') + n.name);
n.children && dmp(n.children, level + 1);
});
})(root, 1);
Ausgang:
F
-E
--D
--C
-B
-A
Diese Frage ist interessant, aber Sie haben nicht erklärt, was Sie versucht haben. – AlexMA