从树结构对象创建节点和边

时间:2016-09-11 06:45:33

标签: javascript mongodb algorithm tree

我有一个数组树

[
  '-',
  [
    '+',
    [
      '*',
      2,
      3
    ],
    4
  ],
  3
]

因此每个级别由一个运算符和两个操作数组成。每个操作数可以是操作数本身,也可以是包含运算符和2个操作数的另一个数组。

我需要绘制一个图形,所以我必须从这个树创建节点和边缘。

我已经让它在cytoscape中工作了

function walk(arr, prevRootNode) {
  var rootNode = cy.add({
    group: 'nodes',
    data: {
      name: arr[0]
    }
  });

  if (prevRootNode) {
    cy.add({
      group: 'edges',
      data: {
        source: prevRootNode.id(),
        target: rootNode.id()
      }
    });
  }

  if (Array.isArray(arr[1])) {
    walk(arr[1], rootNode);
  } else {
    var child1Node = cy.add({
      group: 'nodes',
      data: {
        name: arr[1]
      }
    });

    var child1Edge = cy.add({
      group: 'edges',
      data: {
        source: rootNode.id(),
        target: child1Node.id()
      }
    });
  }

  if (Array.isArray(arr[2])) {
    walk(arr[2], rootNode);
  } else {
    var child2Node = cy.add({
      group: 'nodes',
      data: {
        name: arr[2]
      }
    });

    var child2Edge = cy.add({
      group: 'edges',
      data: {
        source: rootNode.id(),
        target: child2Node.id()
      }
    });
  }
}

walk(ast);

但代码难以阅读,我宁愿使数据独立于cytoscape,所以我想要一个节点数组和一个边数组,每个边应该有两个字段source和{{1它保存了边连接在一起的节点的id。

0 个答案:

没有答案