【问题标题】:How to convert newick tree format to tree like Hierarchical javascript object如何将newick树格式转换为像分层javascript对象一样的树
【发布时间】:2016-07-11 14:54:24
【问题描述】:

我目前正在学习 newick 格式。 https://en.wikipedia.org/wiki/Newick_format 我有一棵树的纽维克串

(A,B,(C,D)E)F;

如何将此字符串转换为分层 javascript 对象,如

tree = {
  name: 'F',
  children: [{
    name: 'A'
  }, {
    name: 'B'
  }, {
    name: 'E',
    children: [{
      name: 'C'
    }, {
      name: 'D'
    }]
  }]

}

【问题讨论】:

  • 这个问题很有趣,但你还没有解释你尝试了什么。

标签: javascript logic


【解决方案1】:

下面的代码应该可以与您的示例类似的任何输入正常工作。

但是,它假定每个节点都用一个字符标识。您必须对其进行修改以支持更长的符号。

此外,此代码不是防弹的,并且在输入无效字符串时会在没有任何警告的情况下中断。

主要思想是逆序解析字符串,并使用stack数组跟踪节点层次结构。

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

这里有一个简单的函数可以转储结果结构:

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

输出:

F
-E
--D
--C
-B
-A

【讨论】:

    【解决方案2】:

    您可能希望考虑获取原始树的子字符串并编写一个递归函数来存储每个层次结构中删除的字母。

    可能的首发:

    var str = "Z,I,(A,B,(C,D)E)F,G,H";
    
    var firstClose = str.indexOf("(");
    var lastClose = str.lastIndexOf(")");
    
    console.log(firstClose);
    console.log(lastClose);
    
    var remainingTree = str.substr(firstClose , lastClose);
    console.log(remainingTree);
    
    var lastLetterStr = (str.substring( lastClose + 1 ) );
    var lastLetterArray = lastLetterStr.split(',');
    
    var firstLetterStr = str.substring(0,firstClose-1)
    var firstLetterArray = firstLetterStr.split(',')
    
    console.log(lastLetterArray);
    console.log(firstLetterArray);
    

    remainingTree字符串应用相同的步骤直到字符串为空然后创建tree对象?您必须包含一些逻辑,以便函数知道如何在构建 time 对象时将 (C,D) 关联为 E 的子级

    JS Fiddle

    【讨论】:

      【解决方案3】:

      你可以试试NewickJS

      例子:

      var newick = new Newick('(A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5)F');
      

      或者你可以使用静态方法:

      var tree = Newick.parse('(A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5)F');
      

      结果:

      {
          name: "F",
          branchset: [
          {
              name: "A",
              length: 0.1
          },
          {
              name: "B",
              length: 0.2
          },
          {
              name: "E",
              length: 0.5,
              branchset: [
              {
                  name: "C",
                  length: 0.3
              },
              {
                  name: "D",
                  length: 0.4
              }]
          }]
      }
      

      NewickJS at GitHub

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多